即使经过多年的 C,指针仍然让我感到困惑。
这两个是一样的吗:
int *num;
someFunc(num)
和
int num;
someFunc(&num);
声明一个变量*
使其成为一个指针,&
将一个变量(暂时)变成一个指针?
即使经过多年的 C,指针仍然让我感到困惑。
这两个是一样的吗:
int *num;
someFunc(num)
和
int num;
someFunc(&num);
声明一个变量*
使其成为一个指针,&
将一个变量(暂时)变成一个指针?
不,它们不一样。在第一种情况下,您有一个指向某个随机内存位置的指针(因为您尚未初始化它)。在第二种情况下,获得的指针someFunc
将指向一个有效的位置(变量的地址num
)。
它们在函数调用方面是相同的。然而
不同的是......
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
第二个传递整数的地址,这num
是一件非常合理的事情。第一个传递存储在指针中的任何内容num
。那应该是 a 的地址int
,但在您的示例num
中未初始化,并且该地址可能指向垃圾(充其量)。
&
不会“将变量转换为指针”,它是一个返回变量地址的运算符。根据定义,它是一个指针。因此,没有区别,函数someFunc
以任何一种方式接收指针值(在第一种情况下,它接收指针变量的值的副本,在第二种情况下,它接收 的返回值的副本operator &
)。
在第一种情况下,您声明num
是指向整数的指针。在第二种情况下num
是一个整数。
对于someFunc
函数,在这两种情况下,传递的参数都是指向整数的指针。因此,要打印您需要取消引用的值printf("%d\n", *num)
。
在这两种情况下,由于您尚未初始化,因此该值将是一些垃圾。
希望有帮助。
在 FreeBSD 上更新我第一个出现分段错误,因为未初始化的指针可能指向了它不应该指向的地方。