知识点总结
(二)指向结构体变量的指针
1)结构体变量指针的访问形式
2)指向结构体变量的指针作实参:
#include <stdio.h>
#include <string.h>
struct Student{
int num;
char name[12];
float score[3];
};
void print(struct Student*);
int main( ){
struct Student stu,*pt;
stu.num=12345;
strcpy(stu.name, "Li Fung");
stu.score[0]=67.5;
stu.score[1]=89;
stu.score[2]=78.5;
pt=&stu;
print(pt);
printf("%d %s ", stu.num, stu.name);
printf("%.1f %.1f %.1f\n", stu.score[0], stu.score[1], stu.score[2]);
return 0;
}
void print(struct Student *p){
printf("%d %s ", p->num, p->name);
printf("%.1f %.1f %.1f\n", p->score[0], p->score[1], p->score[2]);
p->score[2]=100;
}
3)使用指向结构体变量的指针的特点:
空间和时间的开销都很小
效率较高,但不够直观
在函数中,可以改变实参指向的结构体
(三)结构体成员为指针『如何正确引用指针数据成员』
1)回顾出现指向整型变量的野指针(给还未指向任何地址的指针赋值)
2)以容易出错的字符型指针作为数据成员为例
a.错例(未给str一段地址空间就强行赋值)
b.危险的例子(可以将s作为字符串的首地址赋值给str,
但一旦s是动态分配的空间,执行完有关s的操作后就释放很正常,之后出现str的语句,str则为野指针)
c.正解(当有数据成员是指针时,必须先为其分配空间! 如此,即使s先分配后释放,也已经为str分配了空间)
#include <stdio.h>
#include <string.h>
#include <malloc.h>
struct Test{
int x;
char *str;
};
int main(){
struct Test a;
a.x=100;
char *s=(char*)malloc(10);
strcpy(s,"hello");
a.str=(char*)malloc(strlen(s)+1);
strcpy(a.str,s);
free(s);
printf("%d %s\n", a.x, a.str);
free(a.str);
return 0;
}