重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
*s表示变量m本身,对*s的赋值就是对m赋值,所以*s=a[p]是正确的。
创新互联的客户来自各行各业,为了共同目标,我们在工作上密切配合,从创业型小企业到企事业单位,感谢他们对我们的要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。专业领域包括成都网站建设、成都网站制作、电商网站开发、微信营销、系统平台开发。
请注意,函数fun中的s变量是一个地址,只对该地址进行重新赋值,并不对其所指向的变量m造成影响。所以s=a[p]不改变main函数中m变量的值。
如果把*s=a[p]改为s=a[p],输出会是乱码。这具有很大的迷惑性,使人以为地址的赋值过程出现了问题。实际上,若把m改为全局变量(全局变量中字符串默认为空,int变量默认为0):
#includestdio.h
#includestring.h
#define N 10
typedef struct ss
{
char num[10];
int s;
}STU;
void fun(STU a[],STU *s)
{
int t,p=0;
t=a[0].s;
for(int i=1;iN;i++)
{
if(ta[i].s)
{
t=a[i].s;
p=i;
}
}
s=a[p]; //这里是错误的语句
}
STU m;
void main()
{
STU a[N]={
{"A01",81},{"A02",81},{"A03",81},{"A04",81},{"A05",81},
{"A06",81},{"A07",81},{"A08",61},{"A09",81},{"A010",81}
};
printf("the original data is :\n");
for(int i=0;iN;i++)
{
printf("NO=%s MARK=%d\n",a[i].num,a[i].s);
}
fun(a,m);
printf("the lowest is %s who's score is %d\n",m.num,m.s);
}
输出的将会是the lowest is who's score is 0
这说明变量m的值并未改变过。
事实上,若非要使用符号,正确的方法是使用“引用”:
#includestdio.h
#includestring.h
#define N 10
typedef struct ss
{
char num[10];
int s;
}STU;
void fun(STU a[],STU s)
{
int t,p=0;
t=a[0].s;
for(int i=1;iN;i++)
{
if(ta[i].s)
{
t=a[i].s;
p=i;
}
}
s=a[p];
}
void main()
{
STU a[N]={
{"A01",81},{"A02",81},{"A03",81},{"A04",81},{"A05",81},
{"A06",81},{"A07",81},{"A08",61},{"A09",81},{"A010",81}
},m;
printf("the original data is :\n");
for(int i=0;iN;i++)
{
printf("NO=%s MARK=%d\n",a[i].num,a[i].s);
}
fun(a,m);
printf("the lowest is %s who's score is %d\n",m.num,m.s);
}
这里的意思是“引用”,你可以百度上搜索C++中符号的两个意义。
第一个问题:
形参是指针,实参就应该是对应数据类型的地址。
例如:
swap(int *x,int *y)
{
int t ;
t = *x;
*x = *y;
*y = t;
}
int main()
{
int a = 2,b=6;
swap(a,b);
//因为swap函数的形参是int类型的指针,所以传入的实参应该是int类型变量的地址
return 0;
}
第二个问题:
当实参是指针的时候,形参应该是什么?
其实很简单,你只要把
第一问列出来 ①实参:地址 ②形参 :指针
一一对应出来 ①实参:指针 ②形参:指针的指针
因为你要在局部函数中改变实参,就需要传递它的地址,指针也是如此,把它类比为int型变量就好了。
个人理解,希望能帮到你,如有不对,欢迎指正
C语言中,函数参数只能传值。与传值对应的是传引用,C语言不支持函数参数传引用,C++语言才支持。
C++传引用函数:
void foo(int a) { a = 3; }
假如a = 2,执行foo(a)后,a = 3。
---
C语言可以模拟传引用,方法是通过指针来实现:
void foo2(int* ap) { *ap = 3; }
假如a = 2,执行foo2(a)后,a = 3
foo2(a)调用本质上仍然是传值,只不过传递的是指针,指针即是地址,地址本质上是一个无符号整数。
如果:
void foo3(int b) { b = 3; }
假如a = 2,执行foo3(a)后,a = 2。这是因为foo3(a)调用过程中,a值传给形参b,修改b的值与实参a无关。
注意到,foo3(a)与上述foo(a)传引用的调用是形式一样的。
既然C语言通过指针可以实现传引用调用,为什么C++还要引入引用这个特性呢?这是因为C++引入的很多新特性需借助引用来实现,比如,拷贝构造函数等等。