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

时间:2013-04-23 22:44:15

标签: 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;
}

典型输出为:

1
2
3212962484
3212962480

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

6 个答案:

答案 0 :(得分:6)

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

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

 int testPointer(int * intArray, int * ptr)
                       ^^^^^^          ^^^

他们住在记忆中的某个地方,你可以通过&amp ;;获得该地点的地址。操作者 。 这与做

类似
int i;
printf("%p\n", (void*)&i);

显示i变量的地址。

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

  

它们代表什么,为什么最后一行总是小于4   第三行

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

我们也可能从中猜到,在你的平台上,如果系统上的堆栈增长,函数的参数将从左到右(第一个intArray,然后是ptr)放在堆栈上在记忆中向下(这是最常见的)

答案 1 :(得分:1)

最后一行总是(在32位系统上恰好是4)小于第3行,因为两个变量都在堆栈上,传统上从内存顶部向下增长。

答案 2 :(得分:1)

您不会破译这些值。它们是操作系统选择的地址和用于保存变量的C内存分配例程。这些是系统确定的内存区域供您使用。

你还要破译什么?

答案 3 :(得分:0)

当调用此函数int testPointer(int * intArray, int * ptr)时,intArrayptr的值存储在堆栈中。因此,&intArray将打印一个与堆栈指针相同的指针,该指针将随程序的每次运行而变化。

当传递2个参数时,每个参数被一个在另一个上面推入堆栈。因为,两个参数被一个接一个地推,指针的大小是4个字节,你会发现差异为4。

答案 4 :(得分:0)

从技术上讲,行为是未定义的,因为%lu指令应对应于long unsigned int类型的参数。这可能对你有用,但只是巧合。你不会想养成依靠巧合的习惯。有些实现long unsigned int的表示和宽度与指针不同,这段代码可能会导致崩溃。

如果要以便携式方式打印这些地址,则需要使用%p指令,该指令对应于void *类型的参数。不要忘记将论点强加给void *,因为int *的表示可能与void *不同。请参阅Question 5.17 of c-faq.com

  

如何解读这些值?

他们的地址。把它们想象成邮政地址。当收楼员想要检索金融资产时,他们会转到该人的地址并拿走电视。当送货员想要寄送包裹时,他会按照地址找到该人。这在概念上类似于通用处理器在计算机上检索和存储值的方式(以非常基本的方式)。

  

他们代表什么......

他们可能表示他们指向的对象的偏移量。例如,当&intArray对应3212962484时,可能表示intArray位于RAM中的3212962484字节。然而,依靠这将是巧合。你打印指针的方式是不可移植的,指针在概念上与整数不同。它们也可能是您的信用卡号码。

  

...为什么最后一行总是比第三行少四个?

巧合,或选择设计编译器,操作系统或CPU的人员。四个也可能是the percentage of answers that fully respond to double-barreled questions

答案 5 :(得分:-1)

这两行是内存中指针的地址。 (您应该使用%p来显示它们。)

由于它们是传递给函数的两个连续int*,因此它们相距sizeof(int*) = 4个字节(在32位系统上)。