int *a1,a1=3;这样不对的,因为a1是指针,是一个地址,其次这是一句(一个;),这句是定义,你同时定义一个名称的变量,不行。可以改为int a1=3;
指针没有分配内存空间是不能用立即数对其赋值的
你可以这样初始化为3
int* a1 = new int(3);
这样赋值是不对的。
指针可以赋值,也可以在定义指针时初始化,赋值或初始化的值是同类型实体的地址:
int* ip;
int iCount = 18;
int* iPtr = &iCount;//初始化
ip = &iCounnt; //赋值
"&"表示实体的地址,由于字面值不认为是具有空间地址的实体,所以不能进行&操作:
ip = &23; //错误
a1是变量
*a1是指针即地址
需要明确的是,你用了两个a1,命名冲突,你先命名了一个a1指针,又命名了一个a1变量,直接不允许。
首先是个不允许的情况,这个前提下你讨论他到底是什么,没意义。
如果你把改成int *a1,a2 = 3;后边的问题我就可以回答了
a1是一个地址,*a1是一个变量,但是*a1 = 3;在本例中是不允许的。不是给变量赋值这么简单。
因为你的a1没有初始化,只是声明了一下,如果你加一句a1 = &a2;情况就不同了,a1有定义了,是指向a2的指针,此时*a1是a2的值,也就是3,此时写一句*a1 = 33;这就相当于把a2改成33了,要注意a1和a2是两个层次,a1存放a2的地址,*a1的数值和a2一样。
如果你想直接int *a1 = 3;这也是错的,在此句中int * 说明a1是指针类型,但是赋值语句中他是作为a1存在的,不是*a1,这是很重要的基础。记住,此句的分解是:(int *) a1 = 3;因此,
a1需要的是一个地址,3是一个数值,这不同于a1 = 3,a1 = 3的大概意思是让a1强行指向内存地址3(先不讨论可行性),而int *a1; *a1 = 3;主要是3是一个常量表达式,是一个右值rvalue,如果指针是看门的管理员,右值你就当他是个临时的房客,临时的房客是没有房间号的,有可能进旅店逛一圈连房都没开就走了(其实,在休息室待了一下),他不可靠。你需要找一个稳定住户a2,来获取相关地址,因为a2声明过了,开过房了
在C++中,定义指针变量如你上面所述可以写成 int *a1。
此时的a1为一个指针变量,其中可以存放一个int类型的变量的地址,也即所谓的a1即指向对应变量的指针。但是,定义以外的地方,例如程序中用到a1时写成你上面写的那个样子*a1 ,其表示取a1所指向的地址中存放的内容;也就是说定义int *a1,此时a1本身就是一个指针了。后面如果用其指针直接用a1,如果要取a1所指向的地址中的内容,要用*a1;
后面的a1 = 3这样赋值是不对的,因为对于指针变量是不可以使用常数对其赋值的;
当然,虽然*a1相当于一个变量,但是如果给*a1赋值,如你上面的形式还是有问题的(虽然编译环境可能不提示);因为这里你只是定义了一个整型变量的指针,还没有对其赋值(没有让其指向已经存在的变量的地址),也就是说a1到底指向那一个地址还不一定,是随机的。这时改变其指向的地址中内容,就好像一个定时炸弹,可能会改变系统某个参数从而报错,当然也可能指向一般的空间而不报错误;
可以这样:
int *a1 = new int;
*a1 = 3;
相当于定义了一个int型指针,并且让其指向新分配的int型的内存地址;然后将3值赋值给对应的已分配的地址中;
这样解释是不是说明白了呢?呵呵,希望对你有帮助!!