C语言指针问题(求高人指点啊)

有四组对指针变量进行操作的语句
1、int *p,*q;q=p;
int a,*p,*q;p=q=&a;
2 int a,*p,*q;q=&a;p=*q;
int a=20,*p;*p=a;
3 int a=b=0,*p;p=&a;b=*p
int a=20;*p,*q=&a;*p=*q;
4 int a=20;*p,*q=&a;p=q;
int p,*q;q=&p;
因为我对指针的定义如何都不是很了解,希望有高手能够详细的讲讲每一句的对错以及原因,万分感激!!
可是貌似1是错的,int *p,*q;q=p; 如果没有指明地址单元,可以赋值么?

让我来帮你综合一下!!!
1、int *p,*q;q=p;
这句基本是对的(但要看你怎么用),首先定义了*P,*q两个指针,q=p这句是将地址p赋给了q,没有问题;
看下面两个句子:
printf("%d",q);----这个句子是正确的,它只是把q中的地址(既p的地址)输出!!
printf("%d",*q);----但这个句子就是错误的了!!*q为p中数据的值!因为p中的内容是未被定义的,所以编译器会在运行是出错哦!!!

int a,*p,*q;p=q=&a; -----这个同上面的道理是一样的,

printf("%d",q);----正确,输出a的地址;
printf("%d",*q);----如果a没有被定义,那么编译器就会报错咯!

2 int a,*p,*q;q=&a;p=*q;
int a=20,*p;*p=a;

分析下:如果这是在一个程序中,第一错就在重定义上!第一行定义了a,*P,第二行又定义a,*p!--重定义下面就不说了,
第二个错在 p=*q;看来你还没理解指针变量,书上明确定义指针变量只能用来存放地址!而*q是一个具体的值(数或者字符什么的)!
第三个隐性错误!*p=a;从你的定义看,指针p未被初始化!(p=*q是错误的)如果你把p=*q改成p=q那么*p=a;就没问题了。如果你删了p=*q,那就错咯!

3 int a=b=0,*p;p=&a;b=*p
int a=20;*p,*q=&a;*p=*q;

分析下:int a=b=0;定义整型变量a,b,但在不同的编译器上不一定正确。有的机子上你要这样定义才正确:int a,b;a=b=0;
*p;p=&a;b=*p:---定义了指针p把a的地址给了p,在把p中存放地址的值(既a的值)给b;-----这句明显是正确的哦!
看下一句:int a=20;*p,*q=&a;*p=*q;错啦!!(标点符号也错啦!)
第一个错:明显p没有初始化!运行是会报错!
第二个错:*q=&a,*q是一个具体的值,而&a是变量a的地址。两者是不能相等的;要明白p存放的是地址,而*p存放的是值。(不考虑多重指针的情况)
看下一句:*p=*q---是正确的,意思是把q所指向的地址上的值给p指向的地址的指。给你个例句:
int a=10,b=20;
int *p=&a,*q=&b;
*p=*q;
结果很明显a=20;既*p=20

4 int a=20;*p,*q=&a;p=q;
int p,*q;q=&p;

最后一点啦!第一行!看似没错!其实---,事实上c语言的定义不能在一次定义中引用此次定义的其他变量!像你的int a=20;*p,*q=&a;p=q;
*q=&a,由于a属于此次定义中的变量,所以出错咯!应该分开定义就OK啦!
int a=20;
int *p,*q=&a;p=q;
注意一点int *p=&a;初学者很不明白!不是,*q是一个具体的值,而&a是变量a的地址。两者是不能相等的;??那为什么这里又正确呢?

其实这有一个误区,你可以这样看(int *)p=&a;当然这样定义是错的
我只是说这样看!在定义指针时把指针定义符‘*’与前面的类型‘int’看成一块!int *p=&a;与下面句子等效
int *p; p=&a;
而int *p; *p=&a是错误的!!

最后一句:int p,*q;q=&p;
注意你这里p是一个整型的变量!!不是指针!像前面的a,b.
明显这句是正确的!

不知道满意不?
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-05-17
1、int *p,*q;q=p;
这句应该是对的,首先定义了*P,*q两个指针,q=p这句是将地址p赋给了q,没有问题;
int a,*p,*q;p=q=&a;
这句也应该是对的,首先定义了*P,*q两个指针和一个整型变量a,p=q=&a这句是将变量a的地址赋给了q和p,没有问题;&a是取变量a的地址的意思,这样做是因为指针存放的就是地址。
2 int a,*p,*q;q=&a;p=*q;
这句里前面没问题,但是p=*q应该是错的,P是一个地址,而*q则是一个具体的值,是不能将值赋给地址变量的。
int a=20,*p;*p=a;
这句没有问题,a是一个代表具体的值的变量,而*p也是,所以没问题。
3 int a=b=0,*p;p=&a;b=*p
这句没问题,可以参照前面所说的。
int a=20;*p,*q=&a;*p=*q;
是不是标点符号有误呀?那个分号?
然后,语法上,*p=&a这个有问题,*p是值而&a是地址,不匹配。
4 int a=20;*p,*q=&a;p=q;
这跟上面一句一样,*q=&a有问题。
int p,*q;q=&p;
没问题。
第2个回答  2009-05-17
1、q=p;错误,p是一个指针但p并未被赋值,p中的内容是不确定的,贸然赋给q可能会报错,第二行正确
2、p=*q;错误,p是指针而*q是指向int的即是a,类型不同会报错
第二行p虽被定义为指针但并未初始化,p中的内容是不确定的,*p=a操作会报错
3、第一行正确
第二行错误,int a=20;*p,*q=&a;*p=*q; 首先p q没有定义类型,其次p没初始化,不能进行赋值操作
4、第一句改为int a=20;int *p,*q=&a;p=q; 就对了
第二句正确
相似回答