即使经过多年的C,指针仍然让我感到困惑。
这两个是否相同:
int *num;
someFunc(num)
和
int num;
someFunc(&num);
使用*
声明变量使其成为指针,&
将变量(暂时)变为指针?
答案 0 :(得分:2)
不,他们不一样。在第一种情况下,您有一个指向某个随机内存位置的指针(因为您尚未初始化它)。在第二种情况下,someFunc
中获得的指针将指向有效位置(变量num
的地址)。
答案 1 :(得分:2)
它们在函数调用方面是相同的。然而
区别在于......
int num
是一个实际的整数,你取其地址。然后可以将其放入指针
int *num
是一个指向int的指针,但是,使用你的代码,它不会指向一个可以保存值的实际int。
所以只有第二个例子是工作代码。
如果...
,第一个会工作int x;
int *num = &x;
someFunc(num)
someFunc看起来像
void someFunc(int *blah)
{
}
所以当你执行函数调用int* num = &x
时,基本上someFunc(&num)
会发生什么,即它实际上正在执行int* blah = &num
答案 2 :(得分:1)
第二个传递整数num
的地址,这是一个非常合理的事情。第一个传递任何恰好存储在指针num
中的内容。那个应该是int
的地址,但是在你的例子中num
是未初始化的,地址可能指向垃圾(充其量)。
答案 3 :(得分:1)
&
不会“将变量转换为指针”,它是一个返回变量地址的运算符。根据定义,这是一个指针。因此,没有区别,函数someFunc
以任一方式接收指针值(在第一种情况下,它接收副本指针变量的值,在第二种情况下,它接收{{的返回值的副本) 1}})。
答案 4 :(得分:1)
在第一种情况下,您声明num
是指向整数的指针。在第二种情况下,num
是一个整数。
对于someFunc
函数,在两种情况下,传递的参数都是指向整数的指针。因此,要打印取消引用printf("%d\n", *num)
所需的值。
在这两种情况下,由于您尚未初始化,因此该值将是一些垃圾。
希望有所帮助。
更新在FreeBSD上我得到第一个分段错误,因为未初始化的指针可能指向某个不应该的位置。