C语言中局部变量与指针变量相加结果为何是6而非3?
C语言指针运算疑惑:a = a+p结果为何是6而非3?
我是C语言初学者,自主练习代码时遇到算法问题。以下是我的代码及运行输出,疑惑为何执行a = a+p后结果为6而非3,希望得到解答。
#include <stdio.h> int main() { int a = 1; printf("value of a = %d\n", a); printf("address of a = %u\n", &a); int *p; printf("value of p = %d\n", p); p = 2; printf("value of p = %d\n", p); a = a+p; printf("value of addition =%d\n", a); return 0; }
输出
value of a = 1
address of a = 947268620
value of p = 947268880
value of p = 2
value of addition =6
核心原因是指针算术运算的规则:
p是int*类型的指针变量,你直接将整数2赋值给它时,p实际代表内存地址为2的指针(注:直接给指针赋值整数属于不规范操作,正确写法应为p = (int*)2;,且该地址通常无效,属于未定义行为)。- 执行
a = a+p时,C语言会按照指针算术规则处理:指针与整数相加,结果是指针地址加上「整数 × 指针指向类型的字节大小」。假设你的系统中sizeof(int)=4(大部分现代系统都是如此),那么p + a的实际计算是2 + 1×4 = 6。 - 最后这个地址值会被隐式转换为
int类型赋值给a,所以最终a的结果是6,而非你预期的1+2=3。
另外补充:代码中直接打印未初始化的指针p的值,这也是未定义行为,输出的是随机内存值。
内容的提问来源于stack exchange,提问作者code_castinator
相关产品推荐
相关产品推荐

