重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
取地址 就是把变量转为指针, 起到传地址调用函数的效果.
创新互联专注于企业成都营销网站建设、网站重做改版、锦屏网站定制设计、自适应品牌网站建设、HTML5建站、电子商务商城网站建设、集团公司官网建设、成都外贸网站建设、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为锦屏等各大城市提供网站开发制作服务。
而C语言中函数传参有两种,传值调用 和传指针调用.
传值调用时, 被调函数中改变参数值不会影响主函数.
只有传指针调用, 才可以将参数值回传给主函数.
scanf中要根据输入对参数赋值, 所以 必须传指针调用.
c 语言函数 形参 列表 中 可以是普通变量 或指针变量,不允许 加取址符。
c++ 语言函数 形参 列表 中 加取址符 的参数 叫 “引用”,c 不支持。
------
函数 调用 的实参 类型 要与 形参对应,只有 形参 为 指针变量 的 实参 才可以是 地址。
void f(int x, int *y){};
int a,b;
int *p;
p=a;
调用
可以是 f(b,a);
可以是 f(b,p);
不可以是 f(b,a);
不可以是 f(b,a);
不可以是 f(b,a);
不可以是 f(b,p);
不可以是 f(b,p);
不可以是 f(b,p);
(但愿回答不被封。)
//c++获取本机IP
#include stdio.h
#include stdlib.h
#include WINSOCK2.H
#pragma comment(lib,"ws2_32.lib")
int getIP(int ,char**)
{
char host_name[255];
if(gethostname(host_name,sizeof(host_name))==SOCKET_ERROR)
{
printf("Error %d when getting local host name\n",WSAGetLastError());
return -1;
}
printf("host name:%s\n",host_name);
struct hostent *phe=gethostbyname(host_name);
if(phe==0)
{
printf("Error host lookup\n");
return -1;
}
for(int i=0;phe-h_addr_list[i]!=0;++i)
{
struct in_addr addr;
memcpy(addr,phe-h_addr_list[i],sizeof(struct in_addr));
printf("Address %d :%s\n",i,inet_ntoa(addr));
}
return 0;
}
int main(int argc,char *argv[])
{
WSAData wsaData;
if(WSAStartup(MAKEWORD(1,1),wsaData)!=0)
{
system("pause");
return -1;
}
int result=getIP(argc,argv);
WSACleanup();
system("pause");
return result;
}
#includeiostream.h
#includestring.h
void getmemory(const char ** p)
{
*p = new char[20];
}
int main()
{
char *str=NULL;
getmemory(str);
strcpy(str,"qew");
return 0;
}
说明为什么会让str获取到p开辟的空间。
那么void getmemory(const char ** p)这个函数形参是什么!形参实际上是p,p是调用函数的一份拷贝,p改变了调用的实参是不会改变的(你的程序的错误)。当我改变的是*p时,因为p是一份指针拷贝,p与实参指针str保存同一块地址,当改变*p时对应的实参指针str指向的内容也就改变了。
仿佛
int a = 5;
int b = a;
b = 3;
cout a;//a依然是5,因为b是a的一份拷贝,b变了,a不会变
int a = 5;
int *p = a;
*p = 3;
cout a;//a为3,因为p中存的是a的地址,当改变p指向的内容时,实际上就是改变a的内容
#include"stdio.h"
void main()
{
int a,b;
scanf("%5d",a); //从键盘上读取整数变量a的值,最多5位数
printf("a=%d\n",a); //输出a=XXXXX (可以是1~5位数)
scanf("%5d%3d",a,b); //从键盘上读取整数变量a的值最多5位数,b的值最多3位数
printf("a=%d\nb=%d\n",a,b); //输出两行,a=XXXXX b=XXX
}
C语言中,函数调用的一般形式为:
函数名(实际参数表)
对无参函数调用时则无实际参数表。实际参数表中的参数可以是常数、变量或其它构造类型数据及表达式。各实参之间用逗号分隔。
#includestdio.h
int fun(int x, int y); // 函数声明,如果函数写在被调用处之前,可以不用声明
void main()
{
int a=1, b=2, c;
c = fun(a, b); // 函数的调用,调用自定义函数fun,其中a,b为实际参数,传递给被调用函数的输入值
}
// 自定义函数fun
int fun(int x, int y) // 函数首部
{ // {}中的语言为函数体
return xy ? x : y; // 返回x和y中较大的一个数
}
扩展资料
C语言中不允许作嵌套的函数定义。因此各函数之间是平行的,不存在上一级函数和下一级函数的问题。但是C语言允许在一个函数的定义中出现对另一个函数的调用。
这样就出现了函数的嵌套调用。即在被调函数中又调用其它函数。这与其它语言的子程序嵌套的情形是类似的。其关系可表示如图。
图表示了两层嵌套的情形。其执行过程是:执行main函数中调用a函数的语句时,即转去执行a函数,在a函数中调用b 函数时,又转去执行b函数,b函数执行完毕返回a函数的断点继续执行,a函数执行完毕返回main函数的断点继续执行。
参考资料:函数调用_百度百科