一、指针:
1、指针是否需要分配到空间问题
定义如下结构体以及指针,*change并未指向任何结构体
struct student{
char name[11],ID[11];
int score;
};
struct student class1[2];
struct student *tem=class1,*max=tem+1,*min=max+1,*change;
经过赋值比较之后,交换max与tem,change可以正常作为中间变量。
if(tem->score > max->score)
change=tem,tem=max,max=change;
if(tem->score < min->score)
change=tem,tem=min,min=change;
总结:交换的只是指针,struct数组内数据并没有影响。
二、. 和->的区别
经查阅知: 箭头(->):左边必须为指针;
点号(.):左边必须为实体。
附上几个尝试以供理解:(结构体及指针声明同上)
1、->的输入与输出正常:
scanf("%s %s %d",max->name,max->ID,&max->score);
printf("%s %s %d",max->name,max->ID,max->core);
2、.的输入正常,由于max指向class1[1],通过max->输出也正常:
scanf("%s %s %d",class1[1].name,class1[1].ID,&class1[1].score);
printf("%s %s %d",max->name,max->ID,max->score);
3、.的输入输出正常:
scanf("%s %s %d",class1[1].name,class1[1].ID,&class1[1].score);
printf("%s %s %d",class1[1].name,class1[1].ID,class1[1].score);
4、 ->的输入正常,由于max指向class[1],通过class[1].xx输出也正常:
scanf("%s %s %d",max->name,max->ID,&max->score);
printf("%s %s %d",class1[1].name,class1[1].ID,class1[1].score);
5、->输入正常,但是对class1[1]取地址然后使用->编译不通过,虽然指针变量存放class1[1]的地址,但是->左边必须是指针,而不能是单纯的地址:
scanf("%s %s %d",max->name,max->ID,&max->score);
printf("%s %s %d",&class1[1]->name,&class1[1]->ID,&class1[1]->score);
6、同样,对于指针max并不能解地址然后使用.,这样
编译不通过。可以理解为对max解地址后它依然是个地址:
scanf("%s %s %d",*max.name,*max.ID,*max.score);
printf("%s %s %d",class1.name,class1[1].ID,class1[1].score);
1-6总结:
箭头左边必须为指针,点左边必须为实体,但是两者右边并不受其影响,指向的如果是像ID,name数组名,那都是地址。指向score这种int类型的那么输入依然需要用取地址符号&。
输入时其实就是像某一地址写入数据,按照数据类型的内存空间向后推,所以scanf("%s %s %d",max->name,max->ID,&max->score);是可行的。
7、通过指针访问结构体内部某一数组的内部成员:
直接通过max->name+3来访问class1[1].name[3],虽然如下的代码可以通过编译,但是运行过程中会出现未知错误:
scanf("%s %s %d",max->name,max->ID,max->score);
printf("%s %c",max->name,max->name+3);
如下操作可以直接访问数组的内部成员,与上面的区别在于
直接打印%c格式需要对指针解地址:
<span style="color:#ff0000;"> </span>scanf("%s %s %d",max->name,max->ID,&max->score);
printf("%s %c",max->name,*(max->name+3));
7总结:打印%s可以使用指针,因为字符串处理是要打印指针指向的地址之后的字符的,二打印%c,%d等需要使用*对指针解地址,再加上以下代码说明: scanf("%s %s %d",max->name,max->ID,&max->score);
printf("%s %s",max->name,max->name+3);
scanf("%s %s %d",max->name,max->ID,&max->score);
printf("%s %s",max->name,max->name+3);