指针和指针变量之间有什么区别?

我知道这是非常基本的,但对我来说有点混乱。
我读了:

指针只不过是一个地址 ,而指针变量只是一个可以存储地址的变量。
当我们将变量i的地址存储在指针变量p ,我们说p 指向 i

 int i, *p = &i; 

p指向i

为了访问指针指向的对象,我们使用* (间接)运算符。

如果p 是指针,*p表示p当前指向的对象。

现在我很困惑,我应该将p指针指针变量称为什么?

附加: 指针总是与地址相同吗?

指针值和指针变量之间的差异如下所示:

 int swap_int(int *i1, int *i2) { int t = *i1; *i1 = *i2; *i2 = t; } int main(void) { int v1 = 0; int v2 = 37; int *p2 = &v2; printf("v1 = %d, v2 = %d\n", v1, v2); swap_int(&v1, p2); printf("v1 = %d, v2 = %d\n", v1, v2); return 0; } 

这里, p2是一个指针变量; 它是一个指向int的指针。 另一方面,在对swap_int()的调用中,参数&v1是指针值,但它在任何意义上都不是指针变量(在调用函数中)。 它是一个指向变量的指针(该变量是v1 ),但只是写&v1不会创建指针变量。 在被调用函数内部,指针&v1的值被赋值给本地指针变量i1 ,指针变量p2的值被赋值给本地指针变量i2 ,但这与说&v1是指针变量不同(因为它不是指针变量;它只是一个指针值)。

然而,出于许多目的,区别是模糊的。 人们会说’ p2是一个指针’,这是真的; 它是一个指针变量,其值是指针值, *p2p2指向的对象的值。 “ v1是一个int ”,你会得到同样的模糊; 它实际上是一个int变量,其值是一个int值。

让我们用一个希望更熟悉的数据类型替换“指针”这个词,比如int

 int n = 42; 

这里42是一个int值, n是一个保存int的变量。 你可以将n称为“ int变量”。 int是一个类似于42或-25315685的数字, int变量包含这些数字。 拥有变量后,您可以为其分配不同的数字。 到目前为止没什么令人困惑的?

指针就像一个int:一个数字。 它恰好是一个标识内存位置的数字,如果某个内容存储在该内存位置,您可以将其称为地址 。 像int一样,指针可以存储在变量中。 存储指针的变量可以称为指针变量。

那么, 指针和指针变量之间的区别是什么? 第一个是值,如数字,第二个存储这些值。 但人们常常通过他们存储的价值来引用变量; 人们不会将n称为“ int变量”而只是int ,即使它可以在不同的时间存储不同的int 。 在本文中,我将做同样的事情,有时候当我指的是指针变量时写指针; 希望这种区别是明确的。

指针总是一个地址吗? 这是一个关于“地址”这个词的含义的问题。 指针总是一个地址,意思是它以某种方式对应于存储器位置,它是该存储器位置的“地址”。 但另一方面,如果程序无法访问内存位置或者没有任何有用的内存存储位置,它真的是一个“地址”吗?

我们现在研究以下代码:

 int *p; p = &n; 

第一行声明一个名为p的指针变量。 可以存储到p中的指针是int数据的存储位置; 这一点很重要,我们稍后会看到。 我们仍然不给p任何值,因此它存储的指针是任意的。 它当然不存储任何有用的地址; 它甚至可能指向程序无法访问的内存区域。

在第二行中,我们使用& -operator获取n变量的地址,并将其分配给p 。 现在p存储n的地址, n是存储n值的存储位置。

我们可以用指针做什么? 我们可以读取和写入指针识别的内存位置。 为此,我们使用* -operator“取消引用”指针,然后可以像使用n一样使用(*p) 。 例如,您可以使用以下内容将新值写入n

 *p = 123; 

在这一点上,很明显为什么我们需要知道p可以指向的数据类型:否则你无法知道你可以分配给什么(*p)

知道p可以指向的数据类型很重要的另一个原因是指针算法 。 例如, p+1是指向存储在n之后的内存中的int的指针; 如果p是指向大数据结构的指针,则p+1将是指向其后存储的相同类型的数据结构的指针。 为此,编译器必须知道指针指向的大小。

令牌p是指针变量,指向变量i 。 我们可以简单地称它为指针。

声明:

 int* p; int i; p = &i; 

p声明为int类型对象的标识符。 这通常更为简洁,因为'p is a pointer to i' 。 在表达式p = &i之后, p可用于引用变量p = &i 。 要使用指针p访问变量i的值,您可以使用解除引用运算符* (例如*p )。 i = 10; 相当于*p = 10;

另外,注意表达式p = &i; 读取我使用的& ampersand运算符的Address of operand也称为Address of operand

指针只是一个逻辑地址(可以引用变量的标识符)。 C标准没有定义指针在内部的内容以及它在内部的工作方式。

您想阅读: 如果不是内存地址,C指针究竟是什么?
另外,请阅读: 了解指针的用途。

术语指针和指针变量通常用于同义词。

变量是存储值的位置。 在C中,无论何时在需要值的上下文中使用变量,都会检索变量的值,因此在该上下文中说“p”与“变量p的值”相同:

 int *q = p; // Copy the value of variable p into the variable q. // aka: copy p into q. 

指针:一个变量,其值是另一个变量的地址。

指针变量:包含存储另一个变量,数据值或函数的内存的位置或地址的变量。