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

时间:2017-12-25 07:42:52

标签: c gcc c99

我正在运行这个程序:

insertBefore

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

#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);
}

这里发生了什么?

1 个答案:

答案 0 :(得分:3)

当您对指针执行+ 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. 将指针增加sizeof(int)(无意中指向不同的内存地址),然后将其转换为char*并将其指定给新指针。
  4. 将指向此新内存地址的字节指定为值65'A')。
  5. 这可能就是你想要做的事情:

    #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);
    }