c语言关于*号的问题

来源:百度知道 编辑:UC知道 时间:2024/06/22 19:31:26
#include<stdio.h>
main()
{
struct stu
{long num;
char name[20];
int age;
}st[3]={{1001,"wang",19},{1002,"li",18},{1003,"zhang",20}},*p,*q;
q=(struct stu *)st[0].name;
for(p=q;p<q+3;p++)
printf("%s\t",p);
}
上面程序中q=(struct stu *)st[0].name;这句里面的*有什么用啊
为什么要*号啊?

这个程序中*的意思是指针.st[3]为结构stu类型的数组.q为结构stu类型的指针.在q=(struct stu *)st[0].name中,由于st[0].name是st[0]中数组name[20]的数组名,其类型为数组指针即(char *),这样和q的类型不一致,直接赋值会报错.故程序中q=(struct stu *)st[0].name;语句使用(struct stu *)进行强制类型转换,将st[0].name转换成结构指针赋值给q.
如果这个程序想要的目的为输出结构中name的内容,那么指针p,q使用是错误的.只输出st[0].name的话,应该将p,q定义为char *,而且q=(struct stu *)st[0].name;改为q=st[0].name;结果输出为wangangng.如果这个程序需要输出st[]数组3个name[]的话,只用将q=(struct stu *)st[0].name;修改为q=st[0];printf("%s\t",p);
修改为printf("%s\t",p->name); 此时输出应该为wanglizhang

其实这里执行q=(struct stu *)st[0].name;是求一个起始地址量;

比如说str[0].name的地址值和str[1].name地址值相差sizeof(struct stu)

的,而p++是没次把p的地址值+上sizeof(struct stu),所以下面循环其实

最后p的值就是str[0].name~~~~~str[2]. name的值,最后%s输出就是

输出str[0].name~~~~~str[2]. name字符串。

使用强制类型转换把q指向结构中的一个成员,在其后作++运算时正好把q指向下一个结构的同一个成员,这展示了一个不那么规范的用法,千万别在代码中使用。而应该直接使用.符号来取得成员,这样的代码更清楚易懂。