指针和变量

时间:2010-02-28 11:51:20

标签: c++ pointers variables

我只需要对变量进行一些澄清

正常变量有两个“部分”吗? 一部分是实际值,另一部分是该值在内存中的位置

是吗?

所以指针变量只是普通变量的位置部分,它本身没有值?

11 个答案:

答案 0 :(得分:7)

如果你在谈论C,那么指针只代表另一个间接层。

如果您将变量a视为整数,&aa的地址)就是位置,它在该位置包含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)

a = 100;

指针a(又​​名& a)是一个内存位置,假设为0x1000000,其内容为100。

您可以查看这些slides以澄清!

答案 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中包含12ptr将包含一些值,这是内存中的地址而不是文字值。当它是指针变量时,您可以使用 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)

指针本身也有一个内存位置。但在该位置内,该值是存储其他变量位置的地址。