我想知道C:中这两个版本的main()代码之间的区别是什么:
int main() {
uint32_t a;
f(&a);
}
和
int main() {
uint32_t *a;
f(a);
}
用于功能
void f(uint32_t *pointer) {
// ...
}
答案 0 :(得分:12)
在第一个示例中,您将指针传递给未初始化的变量a
。例如,f()
可以在那里存储一个值,main()
以后可以使用该值。
在第二个示例中,您传递了一个未初始化的指针a
。 f()
无法对其进行任何有用的操作。
答案 1 :(得分:4)
在第一个版本中,您将指向未初始化变量的指针传递给f()。 不要,除非f()的任务是初始化变量。
在第二个版本中,您将未初始化的指针传递给函数f()。 不。
答案 2 :(得分:2)
他们定义了不同类型的变量,没有初始化。
uint32_t a;
在堆栈上定义uint32_t
变量,函数调用将其地址传递给f()
函数。
uint32_t *a;
定义堆栈上的指针并将其值传递给函数。指针未初始化,因此它可以指向任何块,任何访问该地址的尝试都将导致未定义的行为。
从f()
函数的角度来看,它会看到传递给它的指针值。在第一次调用中,它可以使用该地址,而在第二次调用中,它不能。
答案 3 :(得分:2)
好的,所以你知道函数f需要一个指针,就像它听起来像是内存中实际位置的地址一样。对于第一个示例(f(& a)),您必须传递地址,因为它位于堆栈内部,并且在函数生命周期之外的任何地方都不会共享。所以当函数返回时,内存被销毁并且不再可用。只传递指向值的指针,不传递指针的值。这可能会导致问题,因为如果你改变那个值,那么所有“指向它”的东西现在都会被改变。
现在对于第二个你从堆中获取内存或者从哪里获取内存但是存储值的地址而不是实际值,这样你就可以操作它并且什么也不返回,值仍然存在。