【发布时间】:2016-10-20 00:46:39
【问题描述】:
以下代码似乎有效。 linux 上的 gcc 5.2.1 没有给出任何警告。
我是 C 的新手。我通过用英语句子和反复试验写下 & 和 * 运算符在每一行的作用来完成这项工作。
有两件事我不确定。
A 行中p0 的初始值是不可预测的。然而,E 行给 main 中变量 p0 的值指定的地址赋值。这会导致任何问题吗?如果是这样,如何解决?
代码使用了这么多*,比如C行中的***。它可以使用更少的*而不得到gcc的警告吗?
谢谢。
#include <stdlib.h>
#include <stdio.h>
void* f(int*** ptr_p) //C
{
int** p = *(ptr_p); //D
*p = malloc(8); //E
*(*p) = 200; //F
(*p)[1] = 4; //G
}
int main(void)
{
int** p0; //A
f(&p0); //B
printf("%d, %d\n",*(*p0), (*p0)[1]);
free(*p0); //H
}
如果你想看英文句子,就在这里。
警告:我是 C 的新手,我不知道他们是否都正确。
线 [A] int** p0;
p0 的值是不可预测的。
行 [B] f(&p0);
&p0 是变量p0 的地址。 f(&p0) 表示调用函数f 并将&p0 分配给函数的第一个参数。
行 [C] void* f(int*** ptr_p)
B 行将&p0 分配给ptr_p。这意味着ptr_p 的值现在等于主函数中变量p0 的地址。
行 [D] int** p = *(ptr_p);
*(ptr_p) 表示由ptr_p 的值指定的地址处的值,解释为地址。 ptr_p的值是主函数中变量p0的地址,如C行所述。所以,*(ptr_p)是主函数中变量p0的值。
p = *(ptr_p); 表示将主函数中p0 的值赋给p 的值
行 [E] *(p) = malloc(8);
*(p) 表示由p 的值指定的地址处的值。 p 的值是 main 中 p0 变量的值,如 [D] 行中所述。那么*(p)表示main()中p0变量的值所指定的地址值。
malloc(8)在内存中保留8个字节,并返回8个字节中第一个字节的地址。
整行的意思是将这8个字节的第一个字节的地址赋值为main()中的p0变量指定的地址的值。
行 [F] *(*p) = 200;
行 [G] (*p)[1] = 4;
(p)[1] 表示*(p + 1)
(*p)[1] 表示*(*p + 1)
【问题讨论】:
-
现在是凌晨 3 点 10 分,我现在去睡觉。明天会检查答案。这看起来很有趣也很有用。提前致谢。
标签: c reference dereference