奇怪(对我来说)指针的行为

时间:2011-09-28 09:04:11

标签: c

我正在读指针,但我对它们的性质感到困惑。这就是我的意思。

int x = 4;

//Here I declare p as integer pointer
int *p;

// Here I assign memory address of x to pointer p
p = &x;

// The line below prints result 4 which is expected. If I miss asterisk before p I'll get memory address instead of data which that memory address holds.
printf("%d", *p)

总结当星号在指针之前晃动时它“指向”内存地址。如果星号在指针之前,它“指向”实际数据。 到目前为止一切都很好。

但为什么这段代码能正常工作?

int someIntVariable = 10;

const int *p = &someIntVariable;
printf("%d", *p);

如果我错过了星号,编译器会给我一个警告“警告:初始化从没有强制转换的指针生成整数”

我期望p(如果编译器允许我使用不带星号的p)来保存someIntVariable的内存地址而不是它的“value”;

这里发生了什么?

4 个答案:

答案 0 :(得分:9)

在宣言中:

const int *p = &someIntVariable;

星号不是取消引用运算符。它只是表明p是一个指针。该行与

具有相同的效果
const int *p;
p = &someIntVariable;

答案 1 :(得分:2)

在这里,您将声明一个指针,并在一个步骤中为指针赋值。 它等同于以下代码:

const int *p;
p = &someIntVariable;

这里*不用作解引用运算符。它用在指针声明的上下文中。

答案 2 :(得分:0)

const int *是一种数据类型 - 即指向const int的指针。 p是变量的名称。它在LHS上。

当asterik在RHS上时,它有不同的含义。这意味着取消引用。

答案 3 :(得分:0)

我相信你得到了警告:初始化从没有强制转换的指针生成整数,  当你尝试这种方式时

int someIntVariable = 10;  
const int p = &someIntVariable;
printf("%d", p); 

你想要做的是,你为一个普通变量分配一个地址,并期望它能够正常工作,但这并不是正常变量的使用方式,这就是指针为什么要做这个工作而你试图替换一个指针使用正常变量

我仍然没有找到真正的答案,但请查看我提出的问题I wonder what really the &a returns?