c - 将所有变量声明为指针与在 C 中使用地址运算符

标签 c pointers pass-by-reference

下面两段代码做同样的事情:

void foo(int *num) {...}

int main(void)
{
    int num = 5;
    foo(&num);

    ...
}
void foo(int *num) {...}

int main(void)
{
    int *num;
    *num = 5;
    foo(num);

    ...
}

在这两种情况下,foo 都需要一个指向 int 的指针参数。首先,我声明了一个 int 并使用地址运算符 (&) 将其传递给 foo。在第二个中,我声明了一个指针变量并将其直接传递给 foo。

除了风格偏好之外,是否有使用其中任何一个的理由?我更喜欢将所有变量声明为指针,如第二个,但我更频繁地看到第一个。

最佳答案

不,这两个片段做的事情截然不同。第一个片段是格式正确的代码。第二个片段是由于取消引用未初始化的指针而导致的未定义行为。

第二个版本在执行时可能会崩溃或做一些其他不需要的事情。此外,在任何现代编译器上编译时都带有警告,它会显示警告,例如:

warning: variable 'num' is uninitialized when used here [-Wuninitialized]

关于c - 将所有变量声明为指针与在 C 中使用地址运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55069075/

相关文章:

c - C 中字符串的指针

c - c 中传递指针警告

c - 刚开始学 C,我有一个 bug 快要了我的命

为 ARM 处理器编译基本 C 文件

c - 如何在继续之前显式等待 TCP ACK?

java - 对声明: "Object references are passed by values in Java"的澄清

java - 如何从另一个带有值的类调用的另一个类获取函数的结果

c - UDP 传输 - 实现 CRC-16

c - 左侧后增量

c++ - 构造函数带参数时如何实例化模板类