24.7.8_C学习记录

拓展

数组可以被当作指针直接被函数中的指针形参接受

#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)

这个函数接收两个指针参数:sy。当你在函数调用中使用数组名时,例如:

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;,这是不合法的,因为不能对一个值进行取址再赋值。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值