结构体数组指针详解

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


//定义结构体
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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-12 13:09
下一篇 2024-12-12 13:09

相关推荐

  • Python导入数组

    本文将为您详细阐述Python导入数组的方法、优势、适用场景等方面,并附上代码示例。 一、numpy库的使用 numpy是Python中一个强大的数学库,其中提供了非常丰富的数学函…

    编程 2025-04-29
  • Python返回数组:一次性搞定多种数据类型

    Python是一种多用途的高级编程语言,具有高效性和易读性的特点,因此被广泛应用于数据科学、机器学习、Web开发、游戏开发等各个领域。其中,Python返回数组也是一项非常强大的功…

    编程 2025-04-29
  • 指针Python:为什么Python中不需要使用指针?

    在Python中,指针的使用不像其他语言一样那么常见。这是因为Python有自己的内存管理方式,所以在大多数情况下,不需要显式地使用指针。那么,为什么Python中不需要使用指针呢…

    编程 2025-04-29
  • Python去掉数组的中括号

    在Python中,被中括号包裹的数据结构是列表,列表是Python中非常常见的数据类型之一。但是,有些时候我们需要将列表展开成一维的数组,并且去掉中括号。本文将为大家详细介绍如何用…

    编程 2025-04-29
  • Python操作数组

    本文将从多个方面详细介绍如何使用Python操作5个数组成的列表。 一、数组的定义 数组是一种用于存储相同类型数据的数据结构。Python中的数组是通过列表来实现的,列表中可以存放…

    编程 2025-04-29
  • Vue TS工程结构用法介绍

    在本篇文章中,我们将从多个方面对Vue TS工程结构进行详细的阐述,涵盖文件结构、路由配置、组件间通讯、状态管理等内容,并给出对应的代码示例。 一、文件结构 一个好的文件结构可以极…

    编程 2025-04-29
  • Python程序的三种基本控制结构

    控制结构是编程语言中非常重要的一部分,它们指导着程序如何在不同的情况下执行相应的指令。Python作为一种高级编程语言,也拥有三种基本的控制结构:顺序结构、选择结构和循环结构。 一…

    编程 2025-04-29
  • Python二维数组对齐输出

    本文将从多个方面详细阐述Python二维数组对齐输出的方法与技巧。 一、格式化输出 Python中提供了格式化输出的方法,可以对输出的字符串进行格式化处理。 names = [‘A…

    编程 2025-04-29
  • Java创建一个有10万个元素的数组

    本文将从以下方面对Java创建一个有10万个元素的数组进行详细阐述: 一、基本介绍 Java是一种面向对象的编程语言,其强大的数组功能可以支持创建大规模的多维数组以及各种复杂的数据…

    编程 2025-04-28
  • Python数组随机分组用法介绍

    Python数组随机分组是一个在数据分析与处理中常用的技术,它可以将一个大的数据集分成若干组,以便于进行处理和分析。本文将从多个方面对Python数组随机分组进行详细的阐述,包括使…

    编程 2025-04-28

发表回复

登录后才能评论