11

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

指针无非就是一个地址指针变量只是一个可以存储地址的变量。
当我们将变量的地址存储i在指针变量中p时,我们说p 指向 i

int i, *p = &i;

p指向i.

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

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

现在我很困惑我应该叫什么p—— 指针指针变量

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

4

6 回答 6

7

指针值和指针变量之间的区别如下所示:

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。你会得到同样的模糊 ' v1is an int'; 它实际上是一个int变量,它的值是一个int值。

于 2013-07-14T20:01:20.540 回答
7

让我们将“指针”一词替换为希望更熟悉的数据类型,例如int

int n = 42;

这里 42 是一个int值,并且n是一个包含int. 您可以调用nint变量”。一个 int 是一个像 42 或 -25315685 这样的数字,一个int变量保存这些数字。一旦你有了一个变量,你就可以给它分配不同的数字。到目前为止没有什么令人困惑的事情吗?

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

那么,指针和指针变量有什么区别呢?第一个是一个值,就像一个数字,第二个存储这些值。但是人们通常通过他们存储的值来引用变量。人们不称nint变量”而只是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的指针,它将是一个指向存储在它后面的相同类型的数据结构的指针。为此,编译器必须知道指针指向的大小。

于 2013-07-14T20:11:28.997 回答
2

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

声明:

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

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

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

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

您想阅读:如果不是内存地址,C 指针到底是什么?
此外,请阅读以下内容:了解指针的用途。

于 2013-07-14T19:46:57.440 回答
0

术语指针和指针变量经常作为同义词使用。

于 2013-07-14T19:47:57.470 回答
0

变量是存储值的地方。在 C 中,每当您在需要值的上下文中使用变量时,都会检索该变量的值,因此在该上下文中说“p”与说“变量 p 的值”相同:

int *q = p;  // Copy the value of variable p into the variable q.
             // aka: copy p into q.
于 2013-07-14T19:55:24.807 回答
-1

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

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

于 2015-02-11T03:30:05.853 回答