如何使用指针将结构体数组传递给函数?
如何用指针将结构体数组传递给函数
没问题,我来帮你搞定这个问题。首先得明确:结构体数组的名字本身就是指向数组第一个元素的指针,所以传递起来非常直接,咱们结合你的代码一步步说。
核心原理
当你定义bookings b[5];时,变量b本质上是一个bookings *类型的指针,指向数组的第一个结构体元素b[0]。所以你只需要把这个指针传给checkIn函数就行——不管是直接传数组名,还是取第一个元素的地址,效果完全等价。
修正你的代码
先把你未完成的checkIn调用补全,同时优化一下初始化逻辑(原来的vac赋值放在内层循环里会重复20次,没必要):
#include <stdio.h> #include <stdlib.h> typedef struct{ int lab; int arr[20]; int vac; }bookings; void checkIn(bookings *in) { // 访问数组第一个结构体的lab和arr[0] printf("Lab %d's first PC status: %i\n", in[0].lab, in[0].arr[0]); // 也可以直接访问数组里的其他元素,比如第二个实验室的编号 printf("Second lab number: %d\n", in[1].lab); } int main(){ bookings b[5]; int a,c; /*Initializing struct variables*/ for(a=0;a<5;a++) { for(c=0;c<20;c++) { b[a].arr[c]=0; } // 把vac的初始化移到内层循环外,避免重复赋值 b[a].vac=20; } b[0].lab=101; b[1].lab=201; b[2].lab=301; b[3].lab=401; b[4].lab=501; // 方式1:直接传递数组名(推荐,写法更简洁直观) checkIn(b); // 方式2:传递第一个元素的地址,和上面完全等价 // checkIn(&b[0]); return 0; }
进阶:传递数组长度(避免越界)
如果你的函数需要遍历整个结构体数组,最好额外传递一个数组长度参数,不然函数没法知道数组有多少个元素,容易出现越界访问。比如修改checkIn函数:
void checkIn(bookings *in, int arrLength) { for(int i=0; i<arrLength; i++){ printf("Lab %d has %d vacant PCs\n", in[i].lab, in[i].vac); } }
调用的时候就传数组的长度:
checkIn(b, 5);
额外说明
因为传递的是指针,所以在checkIn函数里对结构体成员的修改会直接影响到原数组的元素。比如你在函数里写in[0].vac = 19;,那么main里的b[0].vac也会变成19——这是指针传递的特性,不用额外做什么。
内容的提问来源于stack exchange,提问作者digdigdoot
相关产品推荐
相关产品推荐

