C语言 int a,*p;*p=a;这个语句对吗?
发布网友
发布时间:2023-11-19 12:51
我来回答
共4个回答
热心网友
时间:2024-10-06 17:09
楼主 一定要 区分 声明、定义、初始化 三者之间的区别哦
int a, *p;
这个叫声明,表示a是一个int类型,p是一个指向int类型的指针
还没有定义哦
*p=a,这个叫赋值语句,但是右边的 a只是一个声明,而没有定义,因此是没有用的,这个用法是错误的
TC支持,那是因为 编译器对 标准C规则进行了扩展,但是换了编译器未必就正确哦
所以好的编程习惯就是一定 按照 标准C规则来
声明:只是一个声明,没有分配内存
定义:这时候,才会分配内存,变量才有意义
初始化:在分配内存时候,给变量一个值
赋值:对一个已经分配内存的变量可以用=赋值(换一个值)
楼主补充了问题,我可以很负责的告诉你,
int a = 3, *p;
*p = a //error
这个是错误的,原因就是:
p是一个为初始化的一个 随机指针,对一个没有初始化的指针进行*运算,这个是取值运算,这个都是错误的,根本就不能对这样的指针做任何操作,严重的有可能p指向了操作系统的一快内存,对他进行操作,系统都有可能 挂掉的
一般的,这样用
int a= 3,*p;
p=&a; //a是已经分配了内存的一个int变量,对它进行取地址&运算,在给指针p进行初始化,
小的地方就能够看出一个人的基本功了,楼主要努力哦
送给楼主一句话了:
二进制的世界,才是程序真正的世界
努力做个 二进制的程序员吧,呵呵,不要太依赖于 编译器哦
记者给分哦
热心网友
时间:2024-10-06 17:09
int a,*p;*p=a;
这个处理,严格讲不算错,但是危险。
*p这个指针变量被声明后,
在进行"*p=a;"处理前,没有进行初始化,也没有对p进行任何赋值处理,
也就是说p没有指向任何有效的地址。
所以此时p指向的就是所谓的野地址,
这个地址有可能是一个空闲的地址(没有被使用),
也有可能是当前正在被系统或者其他程序使用的地址空间,
所以直接进行"*p=a;"处理的话有可能有两个结果:
1. 如果当前p指向一个空闲的地址,可以正常赋值
2. 如果当前p指向一个正在被系统或者其他程序使用的地址空间,那么直接赋值很有可能造成异常发生
====================================================
问题补充:那么假如int a=5,*p;*p=a;
是不是正确
====================================================
这也是有问题的,
注意一下,我上面说的,是指p没有指向任何有效的地址,不是说a没有初始化
这么改才是对的:
int a=8,b=5,*p=&b;//将p指向b的地址,这样p就指向有效地址了
*p=a;//此时的赋值,就是对于b的地址空间赋值,这样b的值就被赋值为a的值了
热心网友
时间:2024-10-06 17:10
int a, *p;
这时候p里面就有个值了,并不是说给它赋值之前他是"空"的。
printf("%d\n", *p);可以查看
但是这个值是一个随机的值,很可能就是系统保护的内存地址,对它进行读写可能造成程序或者系统异常退出。
p=&a;
这个时候p的值就是a的地址,对*P操作,就是操作a
另外,注意区分下面的2种情况:
(1)int a, *p=a;
(2)int a, *p;*p=a;
虽然都是*p=a;但他们是不同的:
int a,*p=a; 等价于 int a,*p;p=a;
同时要注意区分:
(1)指针变量的地址
(2)指针变量指向的地址
指针变量的地址:凡是变量,不管是基本类型,指针类型,结构体,共用体,只要是变量,你定义了它,他就存在栈中的某个位置
指针变量指向的地址:一般我们说给指针分配空间,并不是给指针变量本身分配空间,应该理解为:我们分配了一段空间,然后将它的首地址赋值给指针,也就是让指针指向分配出来的空间。
热心网友
时间:2024-10-06 17:10
"我在TC上试过了,int a,*p;*p=a;没有错误" 这并不能证明这个语句没有错误。因为你的指针变量p是一个野指针,他指向的内存地址是随机不确定的,然后当你;*p=a的时候,就把a的值写进了地址不确定的内存中去。
你需要建立的一种概念是,指针的正确使用是靠程序员的编程素质来保证的。像你说的这种错误,编译器是检查不出错误的,再说了,你向一个地址里面写数据能有什么错误呢,这正是使用指针的便利之处啊。