结构数组和结构指针
1.结构数组
结构数组就是具有相同结构类型的变量集合。假如要定义一个班级40个同学的姓名、性别、年龄和住址,可以定义成一个结构数组。如下所示:
struct { char name[8]; char sex[4]; int age; char addr[40]; }student[40];
也可定义为:
struct string
{
char name[8];
char sex[4];
int age;
char addr[40];
};
struct string student[40];
结构数组成员的访问是以数组元素为结构变量的, 其形式为:
结构数组元素.成员名
eg:
student[0].name
student[30].age
2.结构指针
结构指针是指向结构的指针。它由一个加在结构变量名前的* 操作符来定义, 例如用前面已说明的结构定义一个结构指针如下:
定义方式:
struct string { char name[8]; char sex[4]; int age; char addr[40]; }*student;
也可以:
struct string *student;
使用结构指针对结构成员的访问,与结构变量对结构成员的访问在表达方式上有所不同。结构指针对结构成员的访问表示为:
结构指针名->结构成员
需要指出的是结构指针是指向结构的一个指针,即结构中第一个成员的首地址,只要是指针,要使用它前就必须保证指针变量的值是一个有效的值;否则,它指向的内存一定是垃圾数据!因此在使用之前应该对结构指针初始化,即分配整个结构长度的字节空间,这可用下面函数完成, 仍以上例来说明如下:
student=(struct string*)malloc(size of (struct string));
在使用结构体指针变量的时候,往往容易犯一个“低级”错误。即定义一个结构体指针变量后就直接对结构体指针变量所指向的结构体成员进行操作,从而产生一些莫名其妙的错误。我们必须要给结构体指针变量赋予一个有效的结构体变量地址,才能正常操作结构体指针变量。比如:
struct UART{
int a;
uchar b;
}
main()
{
struct UART *p;
p->a = 0xXXX;
p->b = 0xXX;
printf("%i,%c",p->b,p->a);
}
这个程序输出的值将是不可预知的,因为“在程序中只是定义了一个结构体指针变量,并没有给该结构体指针变量赋一个有效值,因此该结构体变量所指向的地址将不确定,从而不能得到预期结果”
应该改为:
struct UART{
int a;
uchar b;
}
main()
{
struct UART *p;
struct UART dd;
p = ⅆ //这句一定要有,否则将出现不可预知的问题
p->a = 0xXXX;
p->b = 0xXX;
printf("%i,%c",p->b,p->a);
}
结构体指针需要初始化的,包括结构体指针的成员指针也同样需要初始化
#include #include #include struct student{ char *name; int score; struct student* next; }stu,*stu1; int main(){ stu.name = (char*)malloc(sizeof(char)); /*1.结构体成员指针需要初始化*/ strcpy(stu.name,"Jimy"); stu.score = 99; stu1 = (struct student*)malloc(sizeof(struct student));/*2.结构体指针需要初始化*/ stu1->name = (char*)malloc(sizeof(char));/*3.结构体指针的成员指针同样需要初始化*/ stu.next = stu1; strcpy(stu1->name,"Lucy"); stu1->score = 98; stu1->next = NULL; printf("name %s, score %d \n ",stu.name, stu.score); printf("name %s, score %d \n ",stu1->name, stu1->score); free(stu1); return 0; }
转载:https://www.cnblogs.com/losesea/p/2772526.html
https://www.runoob.com/cprogramming/c-structures.html