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
。所以,*
是一个运算符:遵从运算符。
另外,迂腐一点,=
其实就是赋值运算符
*
的三种一般情况:
- 指针类型。
*
将遵循一个类型。示例:int *
是指向 int 类型的指针。
- 取消引用运算符。这是一个一元运算符,并取消引用一个指针以获取内存地址中的"underlying value"。
- 乘法运算符。这是一个二元运算符。
在 C 语言中,*
符号有 3 种主要用途。它作为类型、一元运算符和算术运算符的一部分出现。
第一种情况,作为类型的一部分用来初始化一个指针。 int* foo
表示 foo 是一个指向整数的指针,也就是说 foo 保存着一个指针的地址。
Ex int* pa = &a
, pa == a.
的地址
第二种情况,作为一元运算符,称为解引用运算符。一元是 *
只有一个正确的值。像这样,它将充当取消引用运算符。取消引用表示给定地址的值。
Ex 根据前面的例子
pa = &a
if (*pa == 1)
看看p持有的地址是什么值
第三种情况很简单,但值得一提的是它与一元运算符的区别。作为一个算术运算符,它需要向左和向右取值。
Exint x = 5 * 5
TL;DR 在 int *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 */
当然,那么你必须想出一些其他的逻辑非...
我仍在努力适应指针。不是概念——我理解内存位置、匹配可变长度的指针增量等——这是语法。这是一个我认为是我 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
。所以,*
是一个运算符:遵从运算符。
另外,迂腐一点,=
其实就是赋值运算符
*
的三种一般情况:
- 指针类型。
*
将遵循一个类型。示例:int *
是指向 int 类型的指针。 - 取消引用运算符。这是一个一元运算符,并取消引用一个指针以获取内存地址中的"underlying value"。
- 乘法运算符。这是一个二元运算符。
在 C 语言中,*
符号有 3 种主要用途。它作为类型、一元运算符和算术运算符的一部分出现。
第一种情况,作为类型的一部分用来初始化一个指针。 int* foo
表示 foo 是一个指向整数的指针,也就是说 foo 保存着一个指针的地址。
Ex int* pa = &a
, pa == a.
第二种情况,作为一元运算符,称为解引用运算符。一元是 *
只有一个正确的值。像这样,它将充当取消引用运算符。取消引用表示给定地址的值。
Ex 根据前面的例子
pa = &a
if (*pa == 1)
看看p持有的地址是什么值
第三种情况很简单,但值得一提的是它与一元运算符的区别。作为一个算术运算符,它需要向左和向右取值。
Exint x = 5 * 5
TL;DR 在 int *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 */
当然,那么你必须想出一些其他的逻辑非...