C语言指针寻址相关问题:数组名赋值与复合运算符疑问
问题1解答
C语言中存在数组名隐式退化的规则:除了作为sizeof、&运算符的操作数,以及用于初始化字符数组的字符串字面量这三类场景外,数组名会自动转换为指向数组首元素的指针。
你给出的代码里直接使用strA时,它会自动退化为&strA[0],类型是char *,和pA的类型完全匹配,因此pA = strA就是把首元素地址赋值给指针的正确写法。
而你提到的&strA是整个数组的地址,类型是char (*)[80](指向长度为80的char数组的指针),和char *类型不兼容,直接赋值会触发编译告警甚至报错。二者的步长也完全不同:strA + 1的地址会偏移1字节(一个char的长度),而&strA + 1的地址会偏移80字节(整个数组的长度)。
问题2解答
这个表达式的运算逻辑由C语言的运算符优先级和结合性决定:
- 前缀自增运算符
++和间接寻址运算符*优先级相同,结合性为从右到左
因此c = * ++ p;等价于c = *(++p);,执行顺序为:
- 先对
p存储的地址值执行自增,让p指向当前地址的下一个同类型元素 - 对自增后的
p执行间接寻址,取出对应地址的值赋值给c
如果要实现对p指向的变量值自增,写法应该是c = ++(*p);即c = ++*p;。
内容的提问来源于stack exchange,提问作者claud
相关产品推荐
相关产品推荐

