我最近很高兴地向一位 C 编程初学者解释了一些指针,并碰巧遇到了以下困难。如果您已经知道如何使用指针,那么这看起来可能根本不是一个问题,但是请尝试以清晰的头脑看下面的示例:
int foo = 1;
int *bar = &foo;
printf("%p\n", (void *)&foo);
printf("%i\n", *bar);
对于绝对的初学者来说,输出可能是令人惊讶的。在第2行中,他/她刚刚声明 * bar 为 & foo,但在第4行中,* bar 实际上是 foo 而不是 & foo!
您可能会说,这种混淆源于 * 符号的模糊性: 在第2行中,它用于声明指针。在第4行中,它被用作一元运算符,用于获取指针所指向的值。两件不同的事,对吧?
然而,这种“解释”对初学者毫无帮助。它通过指出一个微妙的差异引入了一个新的概念。这不可能是正确的教学方法。
Kernighan 和 Ritchie 是怎么解释的?
一元操作符 * 是间接操作符或解引用操作符; 当应用到指针时,它访问指针指向的对象。[...]
指针 ip,
int *ip
的声明是一个助记符; 它表示表达式*ip
是一个 int。变量声明的语法模仿变量可能出现的表达式的语法.
int *ip
应该读作“ *ip
将返回一个 int
”?但是为什么声明后的赋值不遵循这种模式呢?如果初学者想要初始化变量该怎么办?int *ip = 1
(读取: *ip
将返回一个 int
和 int
是 1
)不会像预期的那样工作。概念模型看起来不太一致。我错过了什么吗?
编辑: 它试图在这里总结答案。