C++指针一个小问题(*a=b;)

2024-11-22 05:14:21
推荐回答(5个)
回答1:

这个就有点搞了。赋值符号作为二目运算有左值和右值之分,左值一定是一个可存储的单元,右值一定是一个可以类型转换为左值存储内容类型的量(可以是常量,也可以是变量),运算结果就是将右值的信息存储在左值的存储单元中。在这个理论基础上我们就可以开始探讨你的问题了。int* a;代表了什么意思(答案简单却内藏玄机)?答代表了定义一个变量a,这个变量是整形指针。好了那么根据左值和右值的概念a=&b;这个赋值语句就代表了a这个变量由b(整型变量)的地址来赋值(赋值符号两边的数据类型相同),这个结果也就是你所理解的关联了(其实最好不要有这样的想法,因为以后会有2级指针,3级指针,那时候你就疯了,最好的理解是a指针指向了b变量)。那么*a=b代表了什么呢?代表了将b中的量存储到*a的存储单元中(也就是a指针所指向的内存位置),这等同于int a,c;a=c;你不会说a和c建立了关联。这只不过是个简单的赋值动作罢了。
我把我写的一个小文章复制一下你看看你不能看懂。希望能帮助你进一步的了解指针相关的知识,从而更好的理解内存地址与指针的关系
*, int*;&,*;p,*p
*与int*的辨析
首先大伙知道*是用来寻址的,也就是*p=右值,右值可以是个常量也可以是存贮于另外一个变量的数据。而int*则代表了指针变量的定义。那么有一种情况容易让人反映迟缓就是int *p=&a;有意思*p不是用来存数据的吗?怎么会存地址?这时我们要注意,这里的*前面有一个类型标识,也就是说这个*的“关系”和类型更紧密些,而非变量p。
结论:当*和类型标识结合的时候这对组合用来定义指针变量,所以要正确认识int *p=&a;这句话
&与*
在C里面这两个符号就是对着干的&用来取地址而*用来找到地址所在的内存位置。
p与*p
这个辨析是要在int * p;这个前提下讨论。也就是三个辨析中最重要的一个。关于指针的两重含义。第一个含义p就是一个变量和整型字符型等等没有差别,p能够存储一个四个字节的无符号整数(VC++编译器)可以做加法,不能做乘法(浮点型还不能做取模运算呢);第二层含意,这个无符号整数比较特殊通过在这个变量上增加*(即*p)就能把这个整数当作编号,找到这个编号所对应的内存地址里所存储的内容。
void f(int **p){ void f(int*p){
(*p)=(int *)malloc(sizeof(int)); p=(int*)malloc(sizeof(int));
} }
根据我们第三个辨析的内容可知,第二段代码里的p就是一个指针变量,函数里面的语句仅仅是为p复制而已,大伙可见p就是一个形参,也可就是说当这个函数调用结束后,p就会和这个函数一起消失。反观第一段代码这里的p是int*这种类型的指针变量相当于(int*)*,这样就可以把分配的空间放置在形参p所指向的空间,也就是函数的外面。有人会想这个空间实在函数内部分配的它不会和函数一起消失吗?(这个问题问得好)我反而有问题要问,那就是这个分配空间位于内存的哪个部分呢?对,是堆区,编译器是不会自动管理这部分内存的全部要靠程序员来维持。

回答2:

a是一个指针变量,在这里指向的是别人的地址,
b是一个变量,而b变量地址的表示法是&b,
要让a指向b的地址就是a=&b,可以说a,&b是同一地址,
而*a=b,只是说把b的值赋给a,他们表示的不是同一个地址,只是同一个值……

回答3:

因为*a在你申明的时候并没有给指针a初始化,如若a为局部变量,那么此时它里面存的值是一个垃圾值,也就是它指向了内存中的某个地址,而这个地址(操作系统的地址)有可能是不允许你去访问的,所以当你去修改这个地址中的值时,系统会出错。

回答4:

*a意为指针a所指的空间内的值
b为指针实际就是一个地址,*a=b意思将一个指针地址赋值给指针a所指的空间
指针a要初始化

回答5:

因为声明指针之后,你没有给指针分配内存空间,a没有指向任何一个整形变量,所以*a=b就是错的。