在C语言中,结构体是一种用户自定义的数据类型,可以将不同类型的数据聚合在一起,形成一个更为复杂的数据类型。而结构数组则是具有相同结构体成员的一组数据,每个元素都是结构体类型。
例如,下面的代码定义了一个结构体类型Person,其中包含了姓名和年龄两个成员:
struct Person{ char name[20];
int age;
};
那么下面的代码定义了一个结构数组persons,其元素为Person类型,长度为3:
struct Person persons[3];
结构数组通常需要遍历或者对其中的元素进行操作,这时需要使用指针。指向结构数组的指针的定义方法和指向单个结构体的指针是相同的,即使用结构体类型加*,例如:
struct Person *p;
此时,p指向的是persons[0]的地址,可以通过指针操作来改变结构体的成员值,例如:
strcpy(p->name, "张三");p->age = 30;
这样就将persons[0]的姓名设置为“张三”,年龄设置为30。
指针数组和结构体数组指针的定义和使用方法也有所不同。指针数组是一个数组,其中的元素都是指针类型,可以指向不同的数据类型。例如:
int *arr[5]; //定义一个指针数组
这样就定义了一个包含5个元素的指针数组,每个元素都是int类型的指针。
而结构体数组指针则是一个指针,指向的是结构体数组。例如:
struct Person (*p_arr)[3]; //定义一个结构体数组指针
此时,p_arr指向的是一个包含3个元素的Person结构体数组的指针。
结构数组指针除了可以对结构体数组的元素进行操作外,还有一些常见的应用场景。其中一个典型的应用场景是在函数中传递结构数组,此时常常使用结构数组指针。
void print_persons(struct Person *p_arr, int size){ int i;
for(i=0;i<size;i++){
printf("姓名:%s,年龄:%d\n", p_arr[i].name, p_arr[i].age);
}
int main(){
struct Person persons[3] = {
{"张三", 20},
{"李四", 25},
{"王五", 30}
};
struct Person *p = persons;
print_persons(p, 3);
return 0;
}
这样就定义了一个包含3个元素的Person结构体数组,然后将其地址赋值给了p,最后通过print_persons函数来打印persons数组中的元素。