C - 指针和参考



我正在学习计算机科学,并在业余时间尝试C编程语言。除此之外,我用这本书来更好地理解:计算机系统:程序员的视角。它还给出了一些 C 语言的示例代码。

所以,我写了一个带有一些指针的代码 - 像这样:int *x.而且我仍在为指针和参考而苦苦挣扎——尽管我认为我理解它。

所以我写了一个小脚本,并尝试了指针和引用。 法典:

#include <stdio.h>
int main() {
int *x;
printf("Pointer: %pn", x);
printf("Value int: %dn", *x);
printf("Pointer ref: %pn", &x);
}

输出在 bash/终端:

Pointer: 0x7ffe99ea7420
Value int: 1
Pointer ref: 0x7ffe99ea7330

(设置: Ubuntu 16.04 x86_64 (

现在我有点困惑,一个未初始化的变量x的值为 1 - 并且指针和引用指向内存地址。 在大学的第一学期,我学习了Java,也了解了JVM和Stack的工作原理。 所以我假设它在 C 中是一样的。编译器为代码中的每个对象分配了一些内存。但是为什么x的值是1

也许有人会很好,会向我解释。 我也非常感谢任何进一步阅读或知识交流的链接。

未初始化的变量具有未指定的值。在分配它们之前读取它们是未定义的行为。因此,x*x表达式是未定义的行为

粗略地说,未定义的行为意味着任何事情都可能发生,并且您的代码被破坏了。这在任何初学者 C 书籍中都有涉及。

这里

int *x;

x是整数指针,指针应指向有效的内存位置,但在您的情况下,它是未初始化的。因此de-referencing(*x)未初始化的指针会导致undefined behavior即任何事情都可能发生,它可能会崩溃。

所以这个答案

printf("Value int: %dn", *x);

未定义的行为,因为X没有任何有效的内存位置。

而这里

printf("Pointer ref: %pn", &x);

你只是打印指针变量x的地址C中没有引用的概念。

编辑 :-从 C 标准 n1570

3.4.3

1未定义的行为行为,在使用非便携式或 错误的程序构造或错误的数据,为此 国际标准没有要求。

6.7声明

double *dp;
*dp = 42; // undefined behavior

未初始化的指针不指向任何位置。取消引用它是非法的。

Pointer: 0x7ffe99ea7420
Value int: 1
Pointer ref: 0x7ffe99ea7330

此输出是undefined行为集的子集。当您多次执行代码时,您获得的输出可能会更改。

在代码中,您尚未初始化int *x;,因此它将具有未指定的值。以下所有 3 个语句都在未初始化的变量上调用,因此每个语句的输出都是undefined

printf("Pointer: %pn", x);
printf("Value int: %dn", *x);

然而

printf("Pointer ref: %pn", &x);

将打印 X 的地址。

最新更新