C编程中的指针
我们已经用char*p=&x将p设置为x的地址;从逻辑上讲,*p=-1应该在第一次迭代中替换x的值(k=1)。实际上(或者当我在VS中运行代码时),完成值分配需要4次迭代。为什么?既然在每次迭代中都执行*p=-1,那么其他三个-1去了哪里?谢谢,因为(在您的机器上)int是四个字节,char是1。用C编程中的指针,c,C,我们已经用char*p=&x将p设置为x的地址;从逻辑上讲,*p=-1应该在第一次迭代中替换x的值(k=1)。实际上(或者当我在VS中运行代码时),完成值分配需要4次迭代。为什么?既然在每次迭代中都执行*p=-1,那么其他三个-1去了哪里?谢谢,因为(在您的机器上)int是四个字节,char是1。用int*p替换char*p。您的作业*p=-1只写入1个字节,int为4个字节 编译器应该已经生成了一个警告,因为您的赋值char*p=&x;不是类型安全的。x是一个int,但您将p声明为char*。
int*p
替换char*p
。您的作业*p=-1
只写入1个字节,int为4个字节
编译器应该已经生成了一个警告,因为您的赋值
char*p=&x
;不是类型安全的。x
是一个int,但您将p
声明为char*
。在大多数现代体系结构中,int的长度正好是4个字符。您正在使用字符大小指针写入int大小的内存空间。它被设置为-1的唯一原因是因为运气-1恰好是0xff表示字符,0xffffffff表示整数,因此在写入四个0xff后,得到一个整数大小为-1。x的地址最初包含以下值:
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);
}
字节1第2第3第4
值255 255 255
第一次迭代:*p=-1;->x的地址255255
p=p+1;->点p到第2字节 第二次迭代:
*p=-1;->x 255的地址255255 p=p+1;->点p到第3字节 第三次迭代:
*p=-1;->x 255的地址255255255
p=p+1;->点p到第4字节 第四次迭代:
*p=-1;->x 255的地址255
p=p+1;->点p到第5字节(x地址之外) 从第5位开始,以此类推,x的值仍然是-1。我认为您的程序在第四次迭代时停止了,因为在第五次迭代时指针p已经超出了范围。此外,编译器应该在编译时给您一个警告,因为您在将x的地址赋给p时并没有键入x的地址。应该是:
char*p=(char*)&x代码>这可能就是为什么他在那里使用(char*)来消除警告。是的,在我写下我的答案后,演员阵容出现了:)这看起来像是家庭作业。它是?您是否尝试过单步遍历代码,并考虑过char和int中的位表示?
Byte 1st 2nd 3rd 4th
Value 255 255 255 255