因此,如果星号位于指针名称之前,则它指的是指向的地址的值
int anInteger = 30;
int* pointer = &anInteger;
*pointer;
虽然指针名称之前没有此运算符,但它指的是指针本身的值,即指针指向的地址
pointer;
(如果我错了或者你刚刚得到一些提示可以纠正我:)) 对我来说,这意味着上面的代码可以转换为以下代码,假设地址为" myInteger"是1234:
int* pointer = 1234;
30;
1234;
现在令我感到困惑的是 - 由于变量引用内存中的位置而名称引用变量,因此当您想要使用指针间接更改变量的值时,这样做很奇怪:
*pointer = 15;
因为那可以转换为30 = 15,这看起来不太有效..
此外,当您直接更改变量的值时,您可以这样做:
anInteger = 33;
其中" anInteger"会引用变量,从而引用内存地址,因此,我会将此代码转换为:
1234 = 33;
因此,为什么在使用指针间接地为变量赋值时,不要这样做:
pointer = 33;
确切的问题: 为什么要写* pointername = 33;而不是pointername = 33?
答案 0 :(得分:5)
确切的问题:为什么要写
*pointername = newValue;
而不是pointername = newValue
?
它们是两个相当不同的东西。 (你可以做到这两点。)
int i = 42;
int x = 23;
int * p = &i;
现在,我可以我指向的位置的内容 ...
*p = 123; // this changes the value of i
或者我可以更改我指向的位置。
p = &x; // now p points to x instead
指针变量的“自然”值是内存地址。因此,如果我分配给“裸”p
,我将分配一个内存地址(例如,我可以通过对变量使用&
运算符来获取内存地址。)
使用运算符*
,我取消引用指针变量。因此,如果我分配给“组合”*p
,我会指定一个指向的类型的值(最终在p
中包含的内存地址)。
答案 1 :(得分:1)
这个怎么样。
// i is the name of a memory location that now contains 5
int i = 5;
// p is the name of a memory location that contains the address of
// the memory location called i
int* p = &i;
// The memory location pointed to by p (which is also called i) now
// has the value 12 assigned to it
*p = 12;
答案 2 :(得分:1)
让我们从:
开始anInteger = 27;
而不是将其翻译为
1234 = 27
让我们把它写成
[1234] := 27
应该被解读为“地址1234的存储单元被赋值27
”。
现在让我们考虑一下
pointer = &newValue;
显然(或许不是),我们会将其翻译为
[1238] := 1242
被读作“地址1238处的存储器单元被赋值1242
”。 (其中1242是newValue
)的地址
现在我们需要一种新方法来编写语句,我们不想改变pointer
变量本身的值,而是想要改变{{1}的变量1}}指向。我们通过添加pointer
:
*
它被翻译成类似的东西:
*pointer = 17
我们可以读作“由存储器单元1246的内容给出地址的存储器单元被赋值为17”。
保持笔直的真正难点是指针的值与它所指向的东西之间的差异。
答案 3 :(得分:-1)
每个内存点都有两个字段,地址字段和数据字段。 例如,您可能位于地址0x1234,但该地址也具有值
Address Value
0x1234 |||||| 0x1E
变量知道地址和值。当你说
int var = 5;
Var有一个地址和一个数据字段,赋值运算符表示用5替换数据字段。
Address Value
0x1234 |||||| 0x05
另一方面, *指针* 具有地址值。当你编写像
这样的代码时int * varPtr = &var;
您说的是varPtr变量的值是一个地址。
Address Value
0x1357 |||||| 0x1234
当你" de-point"像* varPtr这样的指针,你将转到指针中值的地址并谈论它的值。
* varPtr将为0x05
varPtr将是0x1234
var也是0x05