结构体数组指针详解

发布时间:2023-05-20

结构体数组指针定义与使用

//定义结构体
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; i < n; i++) {
        printf("%d %s\n", (pUser+i)->age, (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; i < n; i++) {
            printf("%d %s\n", (pUser+i)->age, (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; j < n; j++) {
                if((pUser+i)->age > (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; i < n; i++) {
            printf("%d %s\n", (pUser+i)->age, (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; j < n; j++) {
                if((pUser+i)->age > (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; i < 3; i++) {
        printf("%d %s\n", (pUser1+i)->age, (pUser1+i)->name);
    }
    //使用结构体数组指针初始化
    User *pUser2 = (User*)malloc(3*sizeof(User)); //动态分配内存
    for(int i=0; i < 3; i++) {
        (pUser2+i)->age = 18+i;
        strcpy((pUser2+i)->name, "Tom");
    }
    for(int i=0; i < 3; i++) {
        printf("%d %s\n", (pUser2+i)->age, (pUser2+i)->name);
    }
    free(pUser2); //释放内存
    return 0;
}

结构体数组指针的使用包括访问、函数参数、排序、赋值、初始化等,可以根据实际需求灵活运用。

结构体数组指针赋值

结构体数组指针可以通过赋值操作指向另一个结构体数组。

结构体数组指针排序

结构体数组指针可以通过排序算法对结构体数组进行排序。

结构体数组指针初始化

结构体数组指针可以通过动态分配内存进行初始化。

结构体数组指针做形参选取

结构体数组指针作为函数形参时,可以根据具体需求选择传递结构体数组还是指向结构体数组的指针。