拓展
数组可以被当作指针直接被函数中的指针形参接受
#include <stdio.h>
void sub(int *,int *);
main()
{
int a[]={1,2,3,4},i,x=0;
for(i=0;i<4;i++)
{
sub(a,&x); //
printf("%d",x); // 4 3 2 1
}
printf("\n");
}
void sub(int *s,int *y) // s:1的地址
{
static int t=3;
*y=s[t]; // x = s[t]; // 4 3 2 1
t--; // t: 2 1 0 -1
}
数组名在大多数情况下可以被视为指向数组第一个元素的指针,因此你可以将数组作为函数参数传递,但这实际上是在传递指向数组首元素的指针。在你给出的例子中,
void sub(int *s, int *y)
这个函数接收两个指针参数:s
和 y
。当你在函数调用中使用数组名时,例如:
sub(a, &x);
这里,a
是一个数组,但当它作为参数传递给 sub
函数时,它自动转换成指向数组第一个元素的指针。因此,s
实际上接收到的是指向数组 a
的首元素的指针,而 y
则是变量 x
的地址。
这种做法非常常见,因为C语言没有提供直接传递整个数组的能力,而是通过传递指向数组的指针来间接实现数组的传递。这样做的好处是可以避免复制整个数组的开销,特别是在处理大型数组时,效率更高。同时,通过修改指针所指向的内容,可以在函数内部改变原数组或变量的值,实现数据的传递和共享。
问题一
(&sp)->cd = 18;为什么这样写?
struct person sp;
sp.age = 10;
(&sp)->cd = 18;
在表达式 (&sp)->cd = 18;
中,括号 ()
确保了操作的优先级,明确表示先对 sp
取地址,然后再使用指针访问成员 cd
。但是,由于 &sp
本身就是指针表达式,直接跟 ->
操作符连接也是合法的,因此括号在这里并不是必须的。
去掉括号后,表达式变为 &sp->cd = 18;
,但是这会产生语法错误,因为在 C 语言中,->
运算符的优先级高于 &
运算符,这意味着表达式将被解释为 &(sp->cd) = 18;
,这是不合法的,因为不能对一个值进行取址再赋值。