将声明的变量传递给函数的指针与传递未声明为指针的变量的地址相同吗?

时间:2012-04-16 04:28:41

标签: c pointers pass-by-reference pass-by-value

即使经过多年的C,指针仍然让我感到困惑。

这两个是否相同:

int *num;
someFunc(num)  

int num;
someFunc(&num);

使用*声明变量使其成为指针,&将变量(暂时)变为指针?

5 个答案:

答案 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上我得到第一个分段错误,因为未初始化的指针可能指向某个不应该的位置。