我仍然在努力适应指针。不是概念 - 我理解内存位置,匹配可变长度的指针增量等 - 它是语法。我认为这是一个例子,我感到困惑/无法直观地抓住它:
int a = 42;
分配并将42放入一个int大小的内存空间
int *pa = &a;
在内存中分配一个指向包含变量" a"的地址的指针。
printf("%d \n", *pa);
打印42。
简单/碱性。困扰我的是:
int *pa = &a;
似乎表明*pa
和&a
相等;等于a
的内存地址。但在:
printf("%d \n", *pa);
*pa
是地址pa
指向的内容。所以*pa
似乎是两个不同的东西(地址或int),具体取决于上下文。并让我担心" =" !=" ="。
现在我没有试图抱怨/重新定义/质疑语言,我只是想知道是否有人有任何提示可以帮助我更好地理解这一点,让它更直观。我认为如果你真的懂语言,它就具有完美的逻辑意义;我希望有人可以解释一下,这对我来说似乎也是合乎逻辑的。
答案 0 :(得分:3)
int *
与*
中的printf("%d \n", *pa);
不同。
具体来说,int *
,整个事情,基本上是一种类型:A"指向int
"类型。
换句话说,int *
是一种类型。
但是,调用*pa
表示取消引用指针pa
。因此,*
是一个运算符:deference运算符。
另外,为了迂腐,=
实际上是赋值运算符。
*
的三个一般情况:
*
将遵循一种类型。示例:int *
是指向int类型的指针。答案 1 :(得分:2)
您的困惑似乎是因为您同时初始化并声明了pa
指针,请参阅
int a = 42;
int *pa;
pa = &a;
现在*pa
和&a
似乎相等。
答案 2 :(得分:2)
在C中,*
符号有3个主要用途。它作为类型,一元运算符和算术运算符的一部分发生。
第一种情况,作为类型的一部分用于初始化指针。 int* foo
表示foo是指向整数的指针,这意味着foo保存指针的地址
前 int* pa = &a
, pa ==地址。
第二种情况,作为一元运算符称为解除引用运算符。一元是*
只有一个值的权利。像这样,它将充当解除引用的运营商。取消引用表示给定地址的值
Ex 跟随上一个示例
pa = &a
if (*pa == 1)
查看地址p的值是
第三种情况是微不足道的,但值得一提的是它与它如何作为一元运算符的区别。作为算术运算符,它需要左右两个值
的实施例强> int x = 5 * 5
TL; DR 在int *pa
中,*
是类型的一部分,而不是变量。将其视为int* pa
可能会更清楚。当它不是类型的一部分时,*
是一个解除引用的运算符,意味着查看该地址处的值。
答案 3 :(得分:1)
如果您使用明确显示pa
的语法作为具有与{{1>}不同的类型的变量,则可能会更直观。这可以通过简单的间距来实现:
a
请注意,我在此处完成的所有内容都会移动int a = 42;
int* pa = &a;
printf("%d", *pa);
声明中的间距,以便pa
附加到其类型而不是变量本身。
请注意,我确实认为语法可能会让人感到困惑 - 它不会成为关于C的第一个令人困惑的事情。我个人可能更喜欢使用像*
这样的东西进行解除引用:
!
当然,那么你必须为逻辑而不是......
提出别的东西