C语言中的&pointer的结果是什么?

6
以下代码的结果是什么:

print(2+3*4)

int* ptr;
printf("%x, %x\n", ptr, &ptr);

我知道ptr是内存中的一个地址,但&ptr是什么?
7个回答

26

&ptr将成为保存ptr的内存位置的地址。本质上它是一个指向指针的指针。


7

它是包含原始内存地址的内存位置的地址(即它是“指向指针”的指针)。


6

&ptr返回指针变量的地址... 如果你愿意的话,它是指向指向器的指针。

这通常用于允许函数改变指针实际指向的位置。


1
这不是地址的地址,而是指向保存地址的变量的指针。如果你有 int x= 3;,那么 &x 不是指向 3 的地址,而是指向 x 的指针。 - Pete Kirkham

6

ptr 不仅仅是“内存中的地址”。ptr 是一个 lvalue,是一个保存地址的内存中的对象。无论它所保存的内容是什么,每个内存中的对象都有自己的地址。

由于 ptr 是内存中的一个对象,它也有自己的地址。当你执行 &ptr 时,得到的就是它的地址。


1
指针只是内存中某些数据位置的引用。*pointer会给你该内存位置存储的值。&运算符返回实际的内存地址,这在本例中就是一个指针。

1
在C语言中,指针只是存储容器,用于保存其他数据块的地址。在这种情况下,ptr保存了某个整数的地址,并且它本身只是内存中的一些数据。因此,&ptr是保存某个整数地址的变量的地址。

3
指针不仅仅是整数。它们可能使用与整数相同的存储大小实现,并且具有与整数相同的位模式加法操作效果。或者它们可能不是这样。例如,在64位Windows上,指针的大小是整数的两倍。在分段内存体系结构中,指针是一个“东西”,可以被认为代表两个独立的数字 - 段和偏移量。就C语言而言,指针只是一个“东西”,与整数的相似之处取决于实现方式。 - Steve Jessop
正确,我所说的指针是整数意思是它们只是一种存储某些整数值的容器。在大多数(据我所知)主要操作系统(Windows、Linux、OS X)中,指针仅是一个指向内存中某个地址的32位或64位数字,您可以添加、减去、乘以等方式来更改t指向的内容。从这个角度来看,它们就像整数一样。但我所说的重要部分是指针本身也有一个地址。 - goatlinks
顺便说一下,gcc(以及大多数C编译器)只允许您对指针进行加减操作,而不允许乘除操作(因为这与指针没有实际意义)。 - mipadi
没错,我指的是像 ptr + i*sizeof(int) 这样的偏移量,这实际上并不是指针乘法。 - goatlinks
它们不仅仅是整数值的存储容器。指针对象是一个存储值的容器,但这个值不一定是整数。正如你编辑时所说,它是一个地址。由于我们知道计算机是由位组成的,你通常可以通过将位串在一起并称之为数字来假装它是一个整数。但你也可以对浮点数这样做——2.0作为IEEE 32位浮点数是0x40000000。虽然如此,你通常不会说浮点数“只是整数”。在C语言中,不同的类型是不同的。 - Steve Jessop
当我处理内存时,我倾向于简化和抽象它的真实本质,并将其视为一个巨大的字节数组。这些字节具有值和索引,我将索引视为“int”。我知道这在技术上并不总是准确的,但它有助于我简化手头的问题。 - goatlinks

0

&ptr 只能存储在 int **var 或双指针变量中,因此 &ptr 实际上是包含另一个地址的 ptr 的地址。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接