0

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

这两个是一样的吗:

int *num;
someFunc(num)  

int num;
someFunc(&num);

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

4

5 回答 5

2

不,它们不一样。在第一种情况下,您有一个指向某个随机内存位置的指针(因为您尚未初始化它)。在第二种情况下,获得的指针someFunc将指向一个有效的位置(变量的地址num)。

于 2012-04-16T04:32:03.320 回答
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

于 2012-04-16T04:33:17.180 回答
1

第二个传递整数的地址,这num是一件非常合理的事情。第一个传递存储在指针中的任何内容num。那应该是 a 的地址int,但在您的示例num中未初始化,并且该地址可能指向垃圾(充其量)。

于 2012-04-16T04:31:48.983 回答
1

&不会“将变量转换为指针”,它是一个返回变量地址的运算符。根据定义,它是一个指针。因此,没有区别,函数someFunc以任何一种方式接收指针值(在第一种情况下,它接收指针变量的值的副本,在第二种情况下,它接收 的返回值的副本operator &)。

于 2012-04-16T04:31:56.173 回答
1

在第一种情况下,您声明num是指向整数的指针。在第二种情况下num是一个整数。

对于someFunc函数,在这两种情况下,传递的参数都是指向整数的指针。因此,要打印您需要取消引用的值printf("%d\n", *num)

在这两种情况下,由于您尚未初始化,因此该值将是一些垃圾。

希望有帮助。

在 FreeBSD 上更新我第一个出现分段错误,因为未初始化的指针可能指向了它不应该指向的地方。

于 2012-04-16T04:36:35.090 回答