什么是指针
在C语言中,指针是一种特殊的数据类型,它可以存储一个变量的内存地址。简单来说,指针就是存储了某个变量在内存中的位置。通过指针可以访问或修改这个变量的值。
int a = 10;
int* ptr = &a; //ptr指向变量a的地址
*ptr = 20; //改变ptr所指向的变量a的值
什么是结构体
结构体是一种用户自定义的数据类型,它可以存储多个不同类型的变量。通过结构体可以将变量组合成一个逻辑单元,方便管理和操作。
struct student{
char name[20];
int age;
float score;
};
struct student stu = {"Tom", 18, 89.5};
printf("%s %d %.1f\n", stu.name, stu.age, stu.score);
指向结构体的指针
指向结构体的指针与指向普通变量的指针类似,只不过它存储的是结构体变量在内存中的地址。
struct student{
char name[20];
int age;
float score;
};
struct student stu = {"Tom", 18, 89.5};
struct student* ptr = &stu;
printf("%s %d %.1f\n", ptr->name, ptr->age, ptr->score);
指针访问结构体成员
指针访问结构体成员可以使用“->”符号,也可以使用“*”符号和“.”符号的组合。前者更为简便。
struct student{
char name[20];
int age;
float score;
};
struct student* ptr = (struct student*)malloc(sizeof(struct student));
strcpy(ptr->name, "Tom");
ptr->age = 18;
ptr->score = 89.5;
printf("%s %d %.1f\n", ptr->name, ptr->age, ptr->score);
free(ptr); //释放空间
指向结构体的数组指针
指向结构体的数组指针可以指向结构体数组,通过指针可以访问数组中的元素。
申明和初始化
指向结构体的数组指针的申明和初始化方法如下:
struct student{
char name[20];
int age;
float score;
};
struct student stu[3] = {{"Tom", 18, 89.5}, {"Jack", 19, 78.0}, {"Lucy", 20, 95.0}};
struct student (*ptr)[3] = &stu;
访问数组元素
通过指向结构体的数组指针访问数组元素,如下所示:
for(int i=0; i<3; i++){
printf("%s %d %.1f\n", (*ptr)[i].name, (*ptr)[i].age, (*ptr)[i].score);
}
常见错误
在使用指向结构体的指针时,一些常见错误可以被避免,比如:
未分配空间
如果没有为指针所指向的结构体分配合适的内存,会导致程序出错。
struct student* ptr;
ptr->age = 18; //未分配空间,会导致错误
类型不匹配
如果指针类型与结构体类型不匹配,会导致编译错误。
struct student{
char name[20];
int age;
float score;
};
int* ptr = (int*)malloc(sizeof(struct student)); //类型不匹配,会导致编译错误
free(ptr); //释放空间
总结
指向结构体的指针是C语言中重要的概念之一,可以用于管理和操作结构体类型的数据。指向结构体的数组指针可以方便地访问结构体数组元素。在使用指针时,需要注意空间分配和类型匹配问题。