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

时间:2013-07-14 19:42:49

标签: c function-pointers

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

  

指针只不过是地址指针变量只是一个可以存储地址<的变量< / strong>即可。
  当我们将变量i的地址存储在指针变量p中时,我们说p 指向 i

int i, *p = &i;

p指向i

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

  

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

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

附加: 指针是否始终与地址相同?

6 个答案:

答案 0 :(得分:6)

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

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的值被赋值给本地指针变量{{1但是,这与说i2是指针变量(因为它不是指针变量;它只是指针值)不同。

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

答案 1 :(得分:6)

让我们用一个希望更熟悉的数据类型替换“指针”这个词,比如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任何值,因此它存储的指针是任意的。它肯定不存储任何有用的地址;它甚至可能指向程序无法访问的内存区域。

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

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

*p = 123;

在这一点上,我们需要知道p可以指向的数据类型变得明显:否则您无法知道可以分配给(*p)的内容。

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

答案 2 :(得分:2)

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

声明:

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

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

另请注意,在表达式p = &i;中,请阅读i我使用的&&符号运算符Address of operand的地址。

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

您想阅读:What exactly is a C pointer if not a memory address?
另外,请阅读:to Understand the purpose of pointers.

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:-1)

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

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