C++ 是否为指针指向的地址赋值?C++;

C++ 是否为指针指向的地址赋值?C++;,c++,C++,因此,如果指针名称前面有一个星号,则表示所指向的地址的值 int anInteger = 30; int* pointer = &anInteger; *pointer; 虽然在指针名称之前没有此运算符,但它引用指针本身的值,即指针指向的地址 pointer; (如果我错了,请纠正我,或者如果你只是得到一些提示来分享:)) 对我来说,这意味着假设“myInteger”的地址是1234,可以将上述代码转换为以下代码: 现在让我困惑的是——由于变量指内存中的位置,名称指变量,所以当您想

因此,如果指针名称前面有一个星号,则表示所指向的地址的值

int anInteger = 30;
int* pointer = &anInteger;
*pointer;
虽然在指针名称之前没有此运算符,但它引用指针本身的值,即指针指向的地址

pointer;
(如果我错了,请纠正我,或者如果你只是得到一些提示来分享:)) 对我来说,这意味着假设“myInteger”的地址是1234,可以将上述代码转换为以下代码:


现在让我困惑的是——由于变量指内存中的位置,名称指变量,所以当您想使用指针间接更改变量的值时,这样做对我来说很奇怪:

*pointer = 15;
pointer = 33;
因为这可以转化为30=15,这看起来不是很有效

另外,当您直接更改变量的值时,您可以这样做:

anInteger = 33;
其中“一个整数”指的是变量,因此指的是内存地址,因此,我将此代码转换为:

1234 = 33;
因此,在使用指针间接为变量赋值时,为什么不这样做呢

*pointer = 15;
pointer = 33;
确切的问题是: 你为什么写*pointername=33;而不是pointername=33?

这个怎么样

// 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;
让我们从以下几点开始:

anInteger = 27;
而不是把它翻译成

1234 = 27
让我们把它写成

[1234] := 27
应将其读取为“地址1234处的存储单元分配了值
27

现在让我们考虑一下

pointer = &newValue;
显然(或者也许不是),我们将把它转化为

[1238] := 1242
读作“地址1238处的存储单元分配了值
1242
”。(其中1242是
newValue
的地址)

现在我们需要一种新的方法来编写语句,我们不想改变
指针
变量本身的值,而是想改变
指针
指向的变量。我们通过在前面加上
*

*pointer = 17
这可以转化为:

[[1246]] := 17
我们可以将其读取为“其地址由存储单元1246的内容给出的存储单元被分配值17”

要保持笔直,真正困难的是指针的值与其指向的对象之间的差异

确切的问题是:为什么要编写
*pointername=newValue而不是
pointername=newValue

这是两件完全不同的事情。(你可以两者兼得。)

现在,我可以更改我指向的位置的内容

或者我可以改变我指向的位置


指针变量的“自然”值是内存地址。因此,如果我分配给“裸”的
p
,我就分配了一个内存地址(例如,我可以通过对变量使用
&
运算符来获得)


使用操作符
*
,我取消了对指针变量的引用。因此,如果我分配给“组合的”
*p
,我会分配一个指向的类型的值(最终位于
p
中包含的内存地址)。

内存的每个点都有两个字段,地址字段和数据字段。 例如,您可能位于地址0x1234,但该地址也有一个值

Address            Value

 0x1234    ||||||   0x1E
变量知道地址和值。当你说

int var = 5;
Var有一个地址和一个数据字段,赋值操作符说用5替换数据字段

Address            Value
 0x1234    ||||||   0x05
另一方面,*指针*具有地址值。当您编写类似

int * varPtr = &var;
您是说varPtr变量的值是一个地址

 Address            Value
 0x1357    ||||||   0x1234
当你“去指向”一个像*varPtr这样的指针时,你将指向指针中的值的地址,并讨论它的值

*varPtr应该是0x05

varPtr应该是0x1234

var也是0x05


这个问题的措辞相当糟糕,当OP感到困惑时,这是可以理解的。我不明白怎么能像你问的那样回答这个问题。。。或者,换一种说法,问题到底是什么?投票结束,因为不清楚。也可能是“过于宽泛”,因为你实际上是通过“什么是变量,什么是地址,什么是指针,什么是赋值”来要求另一轮。。。(
1234=newvalue;
?哦,我的…)欢迎来到堆栈溢出!听起来你可以用一个简单的例子,你的类比已经接近尾声了
*pointer=15
意味着内存位置变为等于
15
,因为
pointer
是当前恰好包含
30
的内存位置的地址。在BCPL中,这一切变得简单多了。。。我清楚地记得我花了多长时间才把脑袋绕在指针上。我和你在一起…谢谢你的回答!然而,在我的问题中,我解释了使用星号和不使用星号之间的区别,这似乎是您试图解释的事情。。不过我不确定。。我还是不明白。。我的意思是,如果使用address of operator返回指向的值,那么为什么可以将该值分配给新的值?这不就是这样吗:23=54;对我来说,这看起来不那么有效?再次感谢,顺便说一句,我很感谢你的回答,但感觉你没有明白我的意思:“齖)()()()(()()()()()()())()。我认为像“23=54”这样的东西会让你一直困惑。不要试图建立像“但那不是……”这样的联系,因为这只会让你进一步误入歧途。如果没有“似乎”的陈述,你的问题可能会回答得更好,这对新手和专业人士来说都很困惑。是的,快速的解决办法可能就是不去想它,但我想知道这类事情。无论如何,您不能为一个值指定另一个值,对吗?那么为什么是c
Address            Value
 0x1234    ||||||   0x05
int * varPtr = &var;
 Address            Value
 0x1357    ||||||   0x1234