我只需要对变量进行一些澄清
正常变量有两个“部分”吗? 一部分是实际值,另一部分是该值在内存中的位置
是吗?
所以指针变量只是普通变量的位置部分,它本身没有值?
答案 0 :(得分:7)
如果你在谈论C,那么指针只代表另一个间接层。
如果您将变量a
视为整数,&a
(a
的地址)就是位置,它在该位置包含a
的值。当您使用a
时,您将从地址中获取值。
指针变量p
在使用时也会从某个位置获取值。但该位置的值是另一个位置,您可以从中获取值。
所以,假设你有:
int a = 7; // set a to 7.
int *p = &a; // set p to the address of a.
在此示例中,a
是位于0x1234的堆栈上的变量,p
位于堆栈上的位置0x1236(16位int /指针系统)。你记忆中的内容是:
+--------+
0x1236 (p) | 0x1234 |
+--------+
0x1234 (a) | 0x0007 |
+--------+
当您使用a
时,例如:
int b = a;
内存位置0x1234的a
值用于设置b
。但是,使用指针:
int c = *p;
首先在内存位置0x1236(值为0x1234)中查找p
的值,然后取消引用它(使用'*')以获取a
的值。
答案 1 :(得分:6)
“2部分”是一种奇怪的谈论方式。变量有一个值,位于内存中的某个位置。因此,例如,在地址0x0004处,您可以获得值7(变量v)。
指针是包含地址的变量。因此,例如,在地址0xff0c处,您可以使用值0x0004(指针p)。
在C:
v是7
& v(v的地址)是0x0004
p是0x0004
& p(p的地址)是0xff0c
* p(由p指出的元素)是7
在实践中,您永远不必担心实际地址,只需要担心关系。不要犹豫,写一些带有非常简单的变量和变量指针的程序,打印值,地址和解引用,我发现它有助于澄清指针。
答案 2 :(得分:1)
一个普通变量,比如一个int,有一个值,并且位于内存中的某个位置。内存中的那个位置不存储在变量中,它只是它的地址。
指针就像一个int。它有一个值(这是另一个变量的地址)和一个位置,它只是它的地址。指向该指针的指针将把地址保存到第一个指针。
答案 3 :(得分:1)
答案 4 :(得分:0)
一块内存有一个地址并存储一个值 指针变量包含地址 取消引用的指针变量包含值。
答案 5 :(得分:0)
例如,在C中,指针值是某事物的地址。通常是其他一些变量的地址。指针变量的值正是指针值。
反过来,指针变量有它们的地址,因此你可以将一个指针变量指定为另一个指针变量的地址。或者您想要的任何变量。
答案 6 :(得分:0)
采取正常的int:
int x ;
x = 400 ;
现在x有一个值,它还有一个地址
printf( "x's value=%d, x's memory location=%d\n", x, &x ) ;
答案 7 :(得分:0)
无论变量是什么类型,无论是指针还是普通变量,所有变量都是内存中具有值的位置。通过在内存中说出位置,这也意味着该位置将具有类似0x1234的地址。因此,所有变量都将有一个地址和一个存储在该地址的值。
当您编写 变量时,编译器认为您正在谈论其地址I.e中的值。 a = 12;
。是a
是一个指针或一个oridnary变量,你给它分配12。假设a
是@ 0x1234,所以这个值12将存储在那个地方。当你在变量名之前添加&
前缀时,这意味着你在谈论变量的地址,因为&
是C和C ++中的一个运算符,它被称为 address-of (再次适用于各种变量);所以&a
表示a。的地址。
<强>差:强>
现在为指针和正常变量之间的区别。指针是包含地址的变量,因为它的值是I.e.如a
中包含12
,ptr
将包含一些值,这是内存中的地址而不是文字值。当它是指针变量时,您可以使用 value-at 运算符*
作为前缀来表示“现在正在讨论存储在该指针所保存的位置的值变量”。即*ptr
表示值@ ptr
指向的位置。因此,当您执行ptr = 12;
时,这意味着您将12分配给ptr
,当您撰写*ptr = 1;
时,它会尝试将值1
置于地址12
在记忆中。
答案 8 :(得分:0)
正常变量有两个“部分”吗?一部分是实际值,另一部分是该值在内存中的位置
变量只包含一个数据:它的值。但是,每当我们读取该值时,我们也知道它的位置(否则我们将无法读取该值)。所以说每个变量都有一个位置也是正确的。它只是没有将存储在变量中,而是将变量存储在该位置。
所以指针变量只是普通变量的位置部分,它本身没有值?
不,指针也是“正常变量”。它包含一个值,并存储在一个位置。 但在这种情况下,它的值是另一个位置。但指针值也存储在内存中的某个位置。必须是,才能存在于该计划中。
当然,指针不会包含它指向的位置,只不过一个字母包含它所寻址的建筑物。它只包含“写下来”的地址。
在地址0x16处,我们可能存储了一个整数。在地址0x42,我们可以创建一个包含值0x16的指针。指针现在“指向”我们的整数。但它不包含整数,指针本身也有一个地址。 (因此在地址0x20处,我们可以通过在其中存储值0x42来创建指向指针的指针。
关键是内存中的所有内容都位于某个地址。并且该地址可以作为数字“写下”。并且该号码可以存储在另一个地址。这就是指针。包含其他对象地址的位置。
答案 9 :(得分:0)
指针包含另一个变量的内存地址,即其值。指针也有自己的内存地址。通过取消引用指针,您可以修改它指向的变量的内容。
指针的一个优点,例如在32位平台上,它们总是大4字节。因此,例如,如果您已将大图像文件加载到内存中,假设它是1兆字节,并且您希望有一个函数修改它,如果您传入指向图像的指针,该指针将只是4个字节。如果你没有使用指针,你将传入1兆字节!
答案 10 :(得分:0)
指针本身也有一个内存位置。但在该位置内,该值是存储其他变量位置的地址。