我知道这是非常基本的,但对我来说有点困惑。
我读了:
指针无非就是一个地址,指针变量只是一个可以存储地址的变量。
当我们将变量的地址存储i
在指针变量中p
时,我们说p
指向i
。
int i, *p = &i;
p
指向i
.
为了访问指针指向的对象,我们使用*
(间接)运算符。
如果
p
是指针,则*p
表示p
当前指向的对象。
现在我很困惑我应该叫什么p
—— 指针或指针变量?
附加:指针总是与地址相同吗?
我知道这是非常基本的,但对我来说有点困惑。
我读了:
指针无非就是一个地址,指针变量只是一个可以存储地址的变量。
当我们将变量的地址存储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
是一个指针”,这是真的;它是一个指针变量,它的值是一个指针值,是指向*p2
的对象的值p2
。你会得到同样的模糊 ' v1
is an int
'; 它实际上是一个int
变量,它的值是一个int
值。
让我们将“指针”一词替换为希望更熟悉的数据类型,例如int
:
int n = 42;
这里 42 是一个int
值,并且n
是一个包含int
. 您可以调用n
“int
变量”。一个 int 是一个像 42 或 -25315685 这样的数字,一个int
变量保存这些数字。一旦你有了一个变量,你就可以给它分配不同的数字。到目前为止没有什么令人困惑的事情吗?
指针就像一个 int:一个数字。它恰好是一个标识内存位置的数字,如果该内存位置存储了某些内容,则可以将其称为地址。与 int 一样,指针可以存储在变量中。存储指针的变量可以称为指针变量。
那么,指针和指针变量有什么区别呢?第一个是一个值,就像一个数字,第二个存储这些值。但是人们通常通过他们存储的值来引用变量。人们不称n
“int
变量”而只是int
,即使它可以在不同的时间存储不同int
的 s。在本文中,当我指的是指针变量时,我会做同样的事情,有时会写指针;希望区别会很清楚。
指针总是地址吗?这是一个关于“地址”一词含义的问题,而不是其他任何问题。从某种意义上说,指针始终是地址,它以一种或另一种方式对应于内存位置,它是该内存位置的“地址”。但另一方面,如果程序无法访问内存位置或其中没有存储任何有用的东西,那么它真的是任何东西的“地址”吗?
现在让我们研究以下代码:
int *p;
p = &n;
第一行声明了一个名为 的指针变量p
。可以存储的指针是数据p
的内存位置int
;这很重要,原因我们稍后会看到。我们仍然没有给出p
任何值,所以它存储的指针是任意的。它当然不会存储任何有用的地址;它甚至可能指向程序无法访问的内存区域。
在第二行中,我们使用 -运算符获取n
变量的地址&
并将其分配给p
. 现在p
存储 的地址n
,即存储 的值的内存位置n
。
我们可以用指针做什么?我们可以读取和写入指针标识的内存位置。为此,我们使用*
- 运算符“取消引用”指针,然后(*p)
可以像使用n
. 例如,您可以n
使用以下命令写入一个新值:
*p = 123;
正是在这一点上,为什么我们需要知道p
可以指向的数据类型变得很明显:否则您将无法知道可以分配给(*p)
.
p
知道可以指向的数据类型很重要的另一个原因是指针算法。例如p+1
是一个指向int
存储在内存中的指针n
;ifp
是一个指向大数据结构p+1
的指针,它将是一个指向存储在它后面的相同类型的数据结构的指针。为此,编译器必须知道指针指向的大小。
令牌p
是一个指针变量,它指向一个变量i
。我们可以简单地称它为指针。
声明:
int* p;
int i;
p = &i;
声明p
为int
类型对象的标识符。这通常更简洁地表述为'p is a pointer to i'
。 p
可用于i
在表达式之后引用 int 变量p = &i
。i
要使用指针访问变量的值,p
您可以使用解引用运算符*
(例如*p
)。并且i = 10;
相当于*p = 10;
。
另外,在表达式p = &i;
中注意读取地址的i
我使用&
& 运算符也称为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.
指针:一个变量,其值为另一个变量的地址。
指针变量:包含存储另一个变量、数据值或函数的内存位置或地址的变量。