C指针处理(基础)

时间:2015-01-26 01:51:40

标签: c pointers

我仍然在努力适应指针。不是概念 - 我理解内存位置,匹配可变长度的指针增量等 - 它是语法。我认为这是一个例子,我感到困惑/无法直观地抓住它:

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),具体取决于上下文。并让我担心" =" !=" ="。

现在我没有试图抱怨/重新定义/质疑语言,我只是想知道是否有人有任何提示可以帮助我更好地理解这一点,让它更直观。我认为如果你真的懂语言,它就具有完美的逻辑意义;我希望有人可以解释一下,这对我来说似乎也是合乎逻辑的。

4 个答案:

答案 0 :(得分:3)

int **中的printf("%d \n", *pa);不同。

具体来说,int *,整个事情,基本上是一种类型:A"指向int"类型。

换句话说,int *是一种类型。

但是,调用*pa表示取消引用指针pa。因此,*是一个运算符:deference运算符。

另外,为了迂腐,=实际上是赋值运算符。

*的三个一般情况:

  1. 指针类型。 *将遵循一种类型。示例:int *是指向int类型的指针。
  2. 取消引用运算符。这是一元运算符,并取消引用指针以获取"基础值"在内存地址。
  3. 乘法运算符。这是一个二元运算符

答案 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的第一个令人困惑的事情。我个人可能更喜欢使用像*这样的东西进行解除引用:

!

当然,那么你必须为逻辑而不是......

提出别的东西