指针和指针变量有什么区别?
我知道这是非常基本的,但对我来说有点混乱。
我读了:
指针不过是一个地址 , 指针变量只是一个可以存储地址的变量。
当我们将变量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 = %dn", v1, v2);
swap_int(&v1, p2);
printf("v1 = %d, v2 = %dn", v1, v2);
return 0;
}
这里, p2
是一个指针变量; 它是一个指向int
的指针。 另一方面,在调用swap_int()
,参数&v1
是一个指针值,但它不是指针变量(在调用函数中)。 它是一个指向变量的指针(并且该变量是v1
),但只需编写&v1
不会创建指针变量。 在被调用的函数内部,指针&v1
的值被分配给本地指针变量i1
,并且指针变量p2
的值被分配给本地指针变量i2
,但这与说&v1
是一个指针变量不一样因为它不是一个指针变量;它只是一个指针值)。
但是,出于许多目的,这种区别是模糊的。 人们会说' p2
是一个指针',这是真的, 它是一个指针变量,它的值是一个指针值, *p2
是p2
指向的对象的值。 ' 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
被存储。
我们可以用指针做什么? 我们可以读取和写入指针标识的内存位置。 要做到这一点,我们用*
-operator“取消引用”指针,然后(*p)
就可以像使用n
一样使用。 例如,你可以用下面的语句把新的值写入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
可以是使用指int变量i
表达后p = &i
。 要使用指针p
访问变量i
值,可以使用Dereference运算符*
(例如*p
)。 Anf i = 10;
相当于*p = 10;
。
另请注意,表达式p = &i;
读取的地址i
我用&
符号操作也被称为Address of operand
。
指针只是一个逻辑地址(一个变量可以被引用的标识符)。 C标准没有定义内部指针的内容以及内部工作原理。
您想阅读:如果不是内存地址,C指针究竟是什么?
此外,请阅读以下内容:了解指针的用途。
上一篇: What's the difference between a pointer, and a pointer variable?
下一篇: Pointer to vector vs vector of pointers vs pointer to vector of pointers