[英]pointers in C programming
int main(void) {
int x = 0;
char* p = (char*) &x;
int k = 0;
while (x != -1) {
*p = -1;
p = p + 1;
k = k + 1;
}
printf("%d", k);
}
我们已经用char * p =&x;将p设置为x的地址。 从逻辑上讲,* p = -1应该在第一次迭代(k = 1)时替换了x的值。 在现实中(或当我在VS中运行代码时),花了4次迭代才能完成值分配。 为什么? 并且因为* p = -1在每次迭代中都执行,所以其他三个-1分别在哪里? 谢谢
将char *p
替换为int *p
。 您的分配*p = -1
仅写入1个字节,而int为4个字节。
您的编译器应该已生成警告,因为您的赋值char *p = &x
; 不是类型安全的。
您正在使用char大小指针来写入int大小的存储空间。 设置为-1的唯一原因是因为运气好。 -1恰好是char的0xff和int的0xffffffff,因此在写入四个0xff之后,您将获得一个int大小的-1。
因为(在您的计算机上)一个int是四个字节,但是一个char是1。
x
是一个整数,但是您将p
声明为char *
。 在大多数现代建筑上,整数将恰好是4个字符的长度。
x的地址最初包含以下值:
Byte 1st 2nd 3rd 4th Value 255 255 255 255
第一次迭代:
* p = -1; -> x 255255255255的地址
p = p + 1; ->将p指向第二个字节
第二次迭代:
* p = -1; - > x的地址255 255 255 255
p = p + 1; ->将p指向第3个字节
第三次迭代:
* p = -1; - > x的地址255 255 255 255
p = p + 1; ->将p指向第4个字节
第4次迭代:
* p = -1; - > x的地址255 255 255 255
p = p + 1; ->将p指向第5个字节(x地址的外部)
从第5位开始,x的值仍为-1。 我认为您的程序在第四次迭代时停止了,因为在第五次迭代中,指针p已经超出范围。 另外,编译器应该在编译时给您一个警告,因为在将x分配给p时,您没有键入x的地址。 应该是:
char* p = (char*) &x;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.