【发布时间】:2012-04-16 04:28:41
【问题描述】:
即使经过多年的 C,指针仍然让我感到困惑。
这两个是一样的吗:
int *num;
someFunc(num)
和
int num;
someFunc(&num);
用* 声明一个变量使它成为一个指针,& 把一个变量(暂时)变成一个指针?
【问题讨论】:
标签: c pointers pass-by-reference pass-by-value
即使经过多年的 C,指针仍然让我感到困惑。
这两个是一样的吗:
int *num;
someFunc(num)
和
int num;
someFunc(&num);
用* 声明一个变量使它成为一个指针,& 把一个变量(暂时)变成一个指针?
【问题讨论】:
标签: c pointers pass-by-reference pass-by-value
不,它们不一样。在第一种情况下,您有一个指向某个随机内存位置的指针(因为您尚未初始化它)。在第二种情况下,someFunc 中获得的指针将指向一个有效的位置(变量num 的地址)。
【讨论】:
int* num,那么它会是一样的。
int* num = 8 将包含内存地址“8”,还是包含指向保存值“8”的内存地址的指针?
int* num = 8 将指向内存位置8,这很可能是一个无效的内存位置。要获得有效的指针,您应该指向已分配的内存块。例如,int x = 8; int *num = &x;。现在num 包含变量x 的地址(在语句int x = 8 中为其分配了内存)。现在,如果您使用*num 取消引用指针,它将获取它所持有地址的内存敌人的内容。所以*num 将获取变量x 的内容。
int *num = 8; 甚至不是有效的 C;它不会编译。
它们在函数调用方面是相同的。不过
不同的是……
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 中存储的任何内容。那应该是int的地址,但在你的例子中num是未初始化的并且地址可能指向垃圾(充其量)。
【讨论】:
& 不会“将变量转换为指针”,它是一个返回变量地址的运算符。根据定义,它是一个指针。因此,没有区别,函数someFunc 以任一方式接收指针值(在第一种情况下,它接收指针变量的值的副本,在第二种情况下,它接收operator & 的返回值的副本) .
【讨论】:
在第一种情况下,您将 num 声明为指向整数的指针。在第二种情况下,num 是一个整数。
对于someFunc 函数,在这两种情况下,传递的参数都是指向整数的指针。因此,要打印您需要取消引用 printf("%d\n", *num) 的值。
在这两种情况下,值都会是一些垃圾,因为您还没有初始化。
希望对您有所帮助。
更新在 FreeBSD 上,我第一个出现分段错误,因为未初始化的指针可能指向了它不应该指向的地方。
【讨论】: