一、结构体数组指针定义与使用
//定义结构体
struct User {
int age;
char name[10];
};
int main() {
//定义结构体数组
User users[3] = {{18, "Alice"}, {20, "Bob"}, {22, "Chris"}};
//定义结构体数组指针
User *pUser = users;
//使用结构体数组指针访问结构体数组
printf("%d %s\n", pUser->age, pUser->name); //18 Alice
printf("%d %s\n", (pUser+1)->age, (pUser+1)->name); //20 Bob
printf("%d %s\n", (pUser+2)->age, (pUser+2)->name); //22 Chris
return 0;
}
结构体数组指针是指向结构体数组首元素的指针,可以通过指针访问结构体数组中的元素。结构体数组和结构体数组指针在定义和使用上没有太大差异,只需注意指针的类型为结构体类型的指针。
二、结构体数组指针强类型转换
//定义结构体
struct User {
int age;
char name[10];
};
int main() {
//定义结构体数组
User users[3] = {{18, "Alice"}, {20, "Bob"}, {22, "Chris"}};
//定义结构体数组指针
void *pVoid = users;
//使用强类型转换的结构体数组指针访问结构体数组
printf("%d %s\n", ((User*)pVoid)->age, ((User*)pVoid)->name); //18 Alice
printf("%d %s\n", ((User*)pVoid+1)->age, ((User*)pVoid+1)->name); //20 Bob
printf("%d %s\n", ((User*)pVoid+2)->age, ((User*)pVoid+2)->name); //22 Chris
return 0;
}
结构体数组指针可以强制转换为任意类型的指针,在访问时需要进行强类型转换。如上例,将结构体数组指针强制转换为结构体类型指针,即可访问结构体数组。
三、结构体数组指针越界
//定义结构体
struct User {
int age;
char name[10];
};
int main() {
//定义结构体数组
User users[3] = {{18, "Alice"}, {20, "Bob"}, {22, "Chris"}};
//定义结构体数组指针
User *pUser = users;
//越界访问结构体数组
printf("%d %s\n", (pUser+3)->age, (pUser+3)->name);
return 0;
}
结构体数组指针访问结构体数组时,需要注意不要越界,否则会访问到未知的内存区域,导致程序崩溃。
四、结构体数组指针做函数参数
//定义结构体
struct User {
int age;
char name[10];
};
//结构体数组指针做函数参数
void printUser(User *pUser, int n) {
for(int i=0; iage, (pUser+i)->name);
}
}
int main() {
//定义结构体数组
User users[3] = {{18, "Alice"}, {20, "Bob"}, {22, "Chris"}};
//定义结构体数组指针
User *pUser = users;
//传递结构体数组指针给函数
printUser(pUser, 3);
return 0;
}
结构体数组指针可以作为函数参数,方便函数对结构体数组进行操作。
五、结构体数组指针如何用
//定义结构体
struct User {
int age;
char name[10];
};
int main() {
//定义结构体数组
User users[3] = {{18, "Alice"}, {20, "Bob"}, {22, "Chris"}};
//定义结构体数组指针
User *pUser = users;
//使用结构体数组指针访问结构体数组
printf("%d %s\n", pUser->age, pUser->name); //18 Alice
printf("%d %s\n", (pUser+1)->age, (pUser+1)->name); //20 Bob
printf("%d %s\n", (pUser+2)->age, (pUser+2)->name); //22 Chris
//使用结构体数组指针做函数参数
void printUser(User *pUser, int n) {
for(int i=0; iage, (pUser+i)->name);
}
}
printUser(pUser, 3);
//使用结构体数组指针排序
void sortUser(User *pUser, int n) {
for(int i=0; i<n-1; i++) {
for(int j=i+1; jage > (pUser+j)->age) {
User temp = *(pUser+i);
*(pUser+i) = *(pUser+j);
*(pUser+j) = temp;
}
}
}
}
sortUser(pUser, 3);
printUser(pUser, 3);
return 0;
}
结构体数组指针在编程中常用于对结构体数组的操作,如访问、排序等。
六、结构体数组指针使用
//定义结构体
struct User {
int age;
char name[10];
};
int main() {
//定义结构体数组
User users[3] = {{18, "Alice"}, {20, "Bob"}, {22, "Chris"}};
//定义结构体数组指针
User *pUser = users;
//使用结构体数组指针访问结构体数组
printf("%d %s\n", pUser->age, pUser->name); //18 Alice
printf("%d %s\n", (pUser+1)->age, (pUser+1)->name); //20 Bob
printf("%d %s\n", (pUser+2)->age, (pUser+2)->name); //22 Chris
//使用结构体数组指针做函数参数
void printUser(User *pUser, int n) {
for(int i=0; iage, (pUser+i)->name);
}
}
printUser(pUser, 3);
//使用结构体数组指针排序
void sortUser(User *pUser, int n) {
for(int i=0; i<n-1; i++) {
for(int j=i+1; jage > (pUser+j)->age) {
User temp = *(pUser+i);
*(pUser+i) = *(pUser+j);
*(pUser+j) = temp;
}
}
}
}
sortUser(pUser, 3);
printUser(pUser, 3);
//使用结构体数组指针赋值
User *pUser1 = pUser; //pUser1指向users数组的首元素
for(int i=0; iage, (pUser1+i)->name);
}
//使用结构体数组指针初始化
User *pUser2 = (User*)malloc(3*sizeof(User)); //动态分配内存
for(int i=0; iage = 18+i;
strcpy((pUser2+i)->name, "Tom");
}
for(int i=0; iage, (pUser2+i)->name);
}
free(pUser2); //释放内存
return 0;
}
结构体数组指针的使用包括访问、函数参数、排序、赋值、初始化等,可以根据实际需求灵活运用。
七、结构体数组指针赋值
结构体数组指针可以通过赋值操作指向另一个结构体数组。
八、结构体数组指针排序
结构体数组指针可以通过排序算法对结构体数组进行排序。
九、结构体数组指针初始化
结构体数组指针可以通过动态分配内存进行初始化。
十、结构体数组指针做形参选取
结构体数组指针作为函数形参时,可以根据具体需求选择传递结构体数组还是指向结构体数组的指针。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/245498.html