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

hac*_*cks 11 c function-pointers

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

一个指针只不过是一个多地址,并且指针变量只是可变量存储地址.
当我们将变量的地址存储i在指针变量中时p,我们说它p 指向 i.

int i, *p = &i;
Run Code Online (Sandbox Code Playgroud)

p指向i.

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

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

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

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

Jon*_*oni 7

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

int n = 42;
Run Code Online (Sandbox Code Playgroud)

这里42是一个int值,n是一个保持a的变量int.你可以称之为n" int变量".int是一个类似于42或-25315685的数字,int变量包含这些数字.拥有变量后,您可以为其指定不同的数字.到目前为止没什么令人困惑的?

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

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

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

我们现在研究以下代码:

int *p;
p = &n;
Run Code Online (Sandbox Code Playgroud)

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

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

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

*p = 123;
Run Code Online (Sandbox Code Playgroud)

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

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


Jon*_*ler 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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