C编程中的指针

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*。

我们已经用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的长度正好是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