将值赋给指针指向的地址? C ++

时间:2017-04-27 14:48:20

标签: c++

因此,如果星号位于指针名称之前,则它指的是指向的地址的值

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?

4 个答案:

答案 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