当我拿指针的地址时,C会发生什么?

del*_*ber 2 c

我有一个示例程序如下:

int testPointer(int * intArray, int * ptr) {
  printf("%i\n", intArray);
  printf("%i\n", ptr);
  printf("%lu\n", &intArray);
  printf("%lu\n", &ptr);
  return 0;
}

int main() {
  int result = testPointer((int *) 0x1, (int *) 0x2);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

典型的输出是:

1
2
3212962484
3212962480
Run Code Online (Sandbox Code Playgroud)

前两行总是一样的,我理解它们是如何产生的.第三行和第四行在每次运行时都有所不同,但第四行的值总是比第三行的值小四.我如何破译这些价值观?它们代表什么,为什么最后一行总是比第三行少四个?

nos*_*nos 6

它为您提供这些变量的地址,即它们的内存位置.

你有这些变量,它们是函数参数,但它们就像testPointer函数中的任何其他局部变量一样:

 int testPointer(int * intArray, int * ptr)
                       ^^^^^^          ^^^
Run Code Online (Sandbox Code Playgroud)

它们位于内存中的某个位置,您可以使用&运算符获取该位置的地址.这与做的类似

int i;
printf("%p\n", (void*)&i);
Run Code Online (Sandbox Code Playgroud)

它显示i变量的地址.

请注意,您应该使用%p来打印指针,因为printf("%p\n", (void*)&ptr);%i或%lu需要一个int或long参数,这可能与给定平台上的指针不兼容.

它们代表什么,为什么最后一行总是比第三行少四个

这是因为编译器已将这两个变量彼此相邻放在内存中,而在您的平台上,指针显然是4字节大.

而我们也可以从这个猜测是你的平台上,函数参数是放在栈上从左至右(第一intArray,然后ptr)如果您的系统上的堆栈内存向下增长(这是最常见的)