解除引用与非解除引用的指针(以及它们背后的解释)

时间:2018-01-28 05:25:54

标签: c pointers

为什么每次我们想要处理链接到的变量时,我们必须取消引用一个指针(已经链接到另一个变量)?如果有一个指针链接到一个变量(例如一个int),那么它的所有其他内容都没有取消引用它有点多余?标准(非解除引用)指针是否有不同的用途?对于尚未解除引用的指针,我们可以做些什么?

示例:pPrice vs *pPrice

我正在学习我的第一门编程语言C,并且我一直想知道这一点。

3 个答案:

答案 0 :(得分:1)

在与之前没有使用指针的人合作时,我想指出一个指针与其他原始类型相比并不特别;它只是一个整数,就像int s或char s一样。它的特殊之处在于我们如何解释其价值 - 具体来说,我们将其价值解释为另一个值的位置(地址)。这有点类似于即使char只是整数,我们解释为基于ASCII编码的字符。仅仅因为我们将指针的值解释为地址,我们就可以执行诸如在其指定的地址处读取或写入存储器之类的操作。

就像你说的那样,我们仍然可以照常访问指向内存的内存,但现在我们还有其他一些好处。

例如,我们可以更改指针的值,从而将其指向内存中的不同位置。如果我们想编写一个修改给定对象的泛型函数,但你想动态决定传递给它的对象,这可能很有用。

此外,指针本身是一个常量,定义的大小(通常是32位或64位),但它可以指向任意大小的对象(例如vectorstring或者用户定义的类型)。这使我们可以传递或存储对象的句柄而不传递/存储整个对象,这可能是昂贵的。

我确定还有一百万个用例我要离开了,但这些是一对可以让你入门的。

答案 1 :(得分:1)

tl; dr:整数变量与对整数变量的引用不同。

在C中,"变量的概念"非常具体。实际上,它是内存中保存变量值的区域。符号是一个方便的符号名称,C代码可以通过该符号名称引用内存区域的内容。 A"参考"是内存位置的地址。由于C是强类型的,因此每个符号表示如何解释与之关联的内存。 (呼!)

所以,

int i;

i指的是一个包含整数的内存位置。

i=5;

使用5的二进制表示填充该内存位置。

int *p;

表示p与内存位置相关联,该内存位置包含指向整数位置的指针(也称为地址)。所以我们可以写,

p = &i;

其中&i是整数值的内存位置的显式地址。因此,pi指的是完全不同的事物。由于p是整数的地址,因此我们可以取消引用它(即,遵循地址)以获取地址位置处的实际整数值(与{{1}相关联的值}})。

i

两个赋值语句在功能上是等效的(它们都将相同的内存位置设置为整数6),因为*p = 6; i = 6; 和解除引用的ip都指向相同的内存位置。值得注意的是,*p与内存位置密不可分,而i可以指向其他位置(尽管,*p与指向的整数指针内存位置密不可分整数)。

答案 2 :(得分:0)

可以修改

ngModelChange以指向不同的pPrice

price