相同的 C 指针显示不同的值?

Same C pointer showing different values?

我是运行这个程序:

#include<stdio.h>

void main(){
  int num = 1025;
  int *poinTer = &num;
  char *pointChar = poinTer+1;
  *pointChar = 'A';

  printf("Size of Integer: %d\n", sizeof(int));
  printf("Address: %d, Value: %d\n", poinTer, *poinTer);
  printf("Address: %d, Value: %c\n", poinTer+1, *(poinTer+1));
  printf("Address: %d, Value: %c\n", pointChar, *pointChar);
}

*pointChar 和 *(pointer+1) 应该输出相同的结果,但我得到的输出是不同的。 *pointChar 未输出任何值:

Size of Integer: 4
Address: 1704004844, Value: 1025
Address: 1704004848, Value: A
Address: 1704004673, Value: 

这里发生了什么?

当你对一个指针执行+ 1时,它不一定将内存地址加1。它会增加sizeof(*ptr)

在这种情况下,poinTer + 1 等同于 (char*)poinTer + sizeof(int)。这实际上使处理数组变得更加容易。

老式的 ptr[i]*(ptr + i) 的语法糖。因此,如果您有一个包含 10 个整数的数组,ptr[4] 将指向第 5 个元素,而不是距基地址 4 个字节(因为整数通常为 4 或 8 个字节)。

所以你实际做的是:

  1. 在栈上创建一个intnum)并赋值1025
  2. 在栈上创建了一个int*(poinTer)并分配给它num
  3. 的内存地址
  4. 将指针增加 sizeof(int)(无意中指向不同的内存地址),然后将其转换为 char* 并将其分配给新指针。
  5. 为指向此新内存地址的字节分配值 65 ('A')。

这可能是您想要做的:

#include<stdio.h>

void main(){
  int num = 1025;
  int *poinTer = &num;
  char *pointChar = (char*)poinTer + 1;
  *pointChar = 'A';

  printf("Size of Integer: %d\n", sizeof(int));
  printf("Address: %d, Value: %d\n", poinTer, *poinTer);
  printf("Address: %d, Value: %c\n", (char*)poinTer + 1, *((char*)poinTer+1));
  printf("Address: %d, Value: %c\n", pointChar, *pointChar);
}