C指针处理(基础)

C Pointer Processing (basics)

我仍在努力适应指针。不是概念——我理解内存位置、匹配可变长度的指针增量等——这是语法。这是一个我认为是我 confused/can 无法直观把握它的原因之一:

int a = 42;

分配 42 并将其放入 int 大小的内存中 space

int *pa = &a;

在内存中分配一个指向包含变量"a"的地址的指针。

printf("%d \n", *pa);

打印 42。

Simple/basic。困扰我的是:

int *pa = &a;

似乎表明 *pa&a 相等 ;等于a的内存地址。但在:

printf("%d \n", *pa);

*pa就是pa指向的地址的内容。所以 *pa 似乎是两种不同的东西(地址或整数),具体取决于上下文。并让我担心“=”!=“=”。

现在我不是要抱怨 about/redefine/question 这种语言,我只是想知道是否有人有任何提示可以帮助我更好地理解它,使它更直观。如果您真的懂这门语言,我认为这是完全合乎逻辑的;我希望有人能解释一下,这样对我来说也很合乎逻辑。

你的困惑似乎是因为你同时初始化和声明了pa指针,看这个

int a = 42;
int *pa;

pa = &a;

现在 *pa&a 似乎 不相等

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

具体来说,int *,整个东西基本上是一种类型:"pointer to an int" 类型。

也就是说,int *是一个类型。

但是,调用 *pa 意味着 取消引用 指针 pa。所以,* 是一个运算符:遵从运算符。

另外,迂腐一点,=其实就是赋值运算符

* 的三种一般情况:

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

在 C 语言中,* 符号有 3 种主要用途。它作为类型、一元运算符和算术运算符的一部分出现。

第一种情况,作为类型的一部分用来初始化一个指针。 int* foo 表示 foo 是一个指向整数的指针,也就是说 foo 保存着一个指针的地址。
Ex int* pa = &a, pa == a.

的地址

第二种情况,作为一元运算符,称为解引用运算符。一元是 * 只有一个正确的值。像这样,它将充当取消引用运算符。取消引用表示给定地址的值。
Ex 根据前面的例子
pa = &a
if (*pa == 1) 看看p持有的地址是什么值

第三种情况很简单,但值得一提的是它与一元运算符的区别。作为一个算术运算符,它需要向左和向右取值。
Exint x = 5 * 5

TL;DRint *pa 中,* 是类型的一部分,而不是变量。将其视为 int* pa 可能更清楚。当它不是类型的一部分时,* 是一个取消引用运算符,意思是查看该地址存在的值。

如果您使用的语法将 pa 显式显示为 类型 a 不同的变量,则可能更直观。这可以通过简单的间距来实现:

int a = 42;
int* pa = &a;
printf("%d", *pa);

请注意,我在这里所做的只是移动 pa 声明中的间距,以便 * 附加到它的类型而不是变量本身。

请注意,我确实认为语法可能会被解释为令人困惑——这并不是关于 C 的第一个令人困惑的事情。就我个人而言,我可能更喜欢使用 ! 之类的东西来取消引用:

int a = 42;
int* pa = &a;
printf ("%d", !pa);  /* this is fantasy C */

当然,那么你必须想出一些其他的逻辑非...