C 打印指针中存储的内容打印该内存地址中存储的内容

C 打印指针中存储的内容打印该内存地址中存储的内容,c,C,当我试着打印这个的时候 #include <stdio.h> int main(){ int x = 3; int *ptr = &x; //printf("Address is : %d\n",&ptr); ptr++; *ptr = 1; printf("%d %d",x,ptr); return 0; } 代码输出3 1,它不应该是3然后ptr的地址吗?。然后,当我第一次取消注释printf时,它会打印出来: 地址:

当我试着打印这个的时候

#include <stdio.h>

int main(){
   int x = 3;
   int *ptr = &x;
   //printf("Address is : %d\n",&ptr);
   ptr++;
   *ptr = 1;
   printf("%d %d",x,ptr);
   return 0;
}
代码输出3 1,它不应该是3然后ptr的地址吗?。然后,当我第一次取消注释printf时,它会打印出来:

地址:6356744

3656752


有人知道发生了什么吗?

您的代码中有几个严重的问题

1使用%d打印指针值或变量地址,但不应打印。这是未定义的行为,所以我们不知道会发生什么。要打印指针值或变量地址,请使用%p并强制转换为空指针,如:

printf("Address is : %p\n",(void*)&ptr);
2您写入未分配给程序的内存。这些线路:

ptr++;
*ptr = 1;
让你写下值1,超过x一步。所以这也是未定义的行为

更正上述内容可为您提供此程序:

#include <stdio.h>

int main(){
   int x = 3;
   int *ptr = &x;
   printf("Address is : %p\n",(void*)&ptr);
   ptr++;
   // *ptr = 1;
   printf("%d %p\n",x,(void*)ptr);
   return 0;
}

但输出可能会因运行和系统而异

将指针作为%d的参数传递是未定义的行为。有一个%p表示void*。请使用printf%d,%x\n,x,ptr。顺便说一句,你也有UB,ptr++增加指向下一个int的指针。你不允许读或写这个位置,但是你可以*ptr=1;这导致UB.Incrementing ptr++;然后分配一个*ptr=1的值;是未定义的行为,因为int x不是数组。您定义了int*ptr=&x;int xAlso,在注释掉的部分中,您混淆了一个指针和该指针的地址。它应该是PrintFadAddress是:%p\n,void*ptr;同样,在下一个printf语句中,您希望得到什么样的输出?答案是:这是未定义的行为。
Address is : 0x7ffc5b0923c8
3 0x7ffc5b0923c8