C语言 int a,*p;*p=a;这个语句对吗?

来源:百度知道 编辑:UC知道 时间:2024/05/28 00:08:58
按资料上说的,*p还没有给分配地址的时候,你就把它给赋值了。那么*p的内存单元在哪呢?或者说连地址都没,那么用什么指向a呢?迷糊。
但是我在TC上试过了,int a,*p;*p=a;没有错误,运行结果也对
请高手指点
那么假如int a=5,*p;*p=a;
是不是正确

楼主 一定要 区分 声明、定义、初始化 三者之间的区别哦
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进行初始化,

小的地方就能够看出一个人的基本功了,楼主要努力哦
送给楼主一句话了:
二进制的世界,才是程序真正的世界
努力做个 二进制的程序员吧,呵呵,不要太依赖于 编译器哦

记者给分哦

"我在TC上试过了,int a,*p;*p=a;没有错误" 这并不能证明这个语句没有错误。因为你的指针变量p是一个野指针,他指向的内存地址是随机不确定的,然后当你;*p=a的时候,就把a的值写进了地址不确定的内存中去。

你需要建立的一种概念是,指针的正确使用是靠程序员的编程素质来保证的。像你说的这种错误,编译器是检查不出错误的,再说了,你向一个地址里面写数据能有什么错误呢,这正是使用指针的便利之处啊。

in