C语言结构体数组的直接赋值及数组的长度计算

一般情况下,对结构体类型的变量或者结构体类型的数组的赋值都是先定义一个结构体类型的变量,然后在对其属性进行赋值。例如:

typedef struct Pi {
    int x;
    int y;
} Pc;

int main() {
    int i;
    Pc pc[2];
    pc[0].x = 1;
    pc[0].y = 2;
    pc[1].x = 3;
    pc[1].y = 4;
    for (i = 0; i < 2; i++) {
        printf("x=%d  y=%d\n", pc[i].x, pc[i].y);
    }
    return 0;
}

运行结果如图:
这里写图片描述

还可以定义变量的时候直接赋初值

typedef struct Pi {
    int x;
    int y;
} Pc;

int main() {

    Pc pc[2] = {
            [0].x = 3,
            [0].y = 4,
            [1].x = 5,
            [1].y = 6
    };
    for (int i = 0; i < 2; i++) {
        printf("x=%d  y=%d\n", pc[i].x, pc[i].y);
    }
    return 0;
}

运行结果如图:
这里写图片描述
有的时候,一个一个赋值会比较麻烦,比如结构体中含有计数器时,初始化计数器必须是0。

#include <stdio.h>

//自定义一个字符串的结构体,包含字符串和字符串长度两个变量
typedef struct Str {
    char ch[100];
    int length;//char数组(字符串)的长度
} myStr;

//刚开始声明变量时每个变量的字符串长度length都为0
//这里以长度为10的数组为例,若数组长度是1000,一个一个赋值就累死了
//对第0个到第9个结构体数组的长度同时赋值为0
myStr myStr1[10] = {
        [0 ... 9] = {
                .length = 0,
        }
};

int main() {
    int i;
    for (i = 0; i < 10; i++) {
        printf("%d\n", myStr1[i].length);
    }
    return 0;
}

运行结果如下:
这里写图片描述
结构体数组初始化的方法说完了,下面说一下怎么得到一个数组的长度,C语言不像Java,Java中每个数组都有长度可以直接使用。
这里写图片描述
而C语言没有这么方便,C语言要求数组长度可已通过sizeof()函数来得到。

int main() {
    int  a[]={1,2,3,4,5,6,7,8};
    //int类型数组a的总空间除以int类型的变量所占的空间就是数组的元素个数(长度)
    int len=sizeof(a)/sizeof(int);
    printf("length = %d\n",len);
    return 0;
}

运行结果如下:
这里写图片描述
接下看一下复杂一点的

typedef struct Pi {
    int x;
    int y;
} Pc;

int main() {
    Pc pc[2] = {
            [0].x = 3,
            [0].y = 4,
            [1].x = 5,
            [1].y = 6
    };

    //sizeof(pc)是pc所包含的所有属性所占的空间
    printf("Total = %d\n", sizeof(pc));

    /*
     * 2 * sizeof(int)是一个pc结构体类型的变量所占的空间,
     * 因为pc的结构体中包含两个int类型的属性
     */
    //总的空间除以每个结构体所占的空间,也就是数组的长度
    int len = sizeof(pc) / (2 * sizeof(int));
    printf("length = %d\n", len);

    //输出
    for (int i = 0; i < len; ++i) {
        printf("x=%d  y=%d\n", pc[i].x, pc[i].y);
    }
}

运行结果:
这里写图片描述
上述做法绝对正确,求出的数组长度绝对正确
不过还有一个简便方法,不过有缺陷,思想都是一样的

int main() {
    int array[] = {1, 2, 3, 4, 5, 6, 7, 8};
    /*
     * 数组长度:
     * 数组占内存总空间,除以单个元素占内存空间大小
     */
    int length = sizeof(array) / sizeof(array[0]);
    printf("length = %d", length);
}

运行结果:
这里写图片描述
下面说一下这种简便做法的缺陷

int getLength(int array[]){
    //这样求长度是错误的,得到的length的结果永远是1
    int length = sizeof(array) / sizeof(array[0]);
    return length;
}

int main() {
    int array[] = {1, 2, 3, 4, 5, 6, 7, 8};
    int length = getLength(array);
    printf("length = %d", length);
}

ps:因为在getLength()函数中,array是函数参数,到了该函数中,array只是一个指针(地址,系统在该函数运行时,是不知道array所表示的地址有多大的数据存储空间,这里只是告诉该函数一个数据存储空间首地址),所以,sizoef(array)的结果是指针变量array占内存的大小,一般是4个字节。array[0]是int类型,sizeof(array[0])也是4个字节,所以,结果永远是1。因此,获得数组长度,只能在数组定义所在的代码区中,采用上述简便方法,才可以达到效果。
运行结果:
这里写图片描述

  • 12
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 结构体数组赋值可以使用循环语句遍历数组元素,逐一对结构体进行赋值操作。下面是一个简单的示例: ``` #include <stdio.h> struct student { char name[20]; int age; float score; }; int main() { struct student stu[3] = {{"Tom", 18, 90.5}, {"Jerry", 19, 85.5}, {"Lucy", 20, 92.0}}; struct student temp; int i, j; printf("Before sorting:\n"); for (i = 0; i < 3; i++) { printf("%s %d %.1f\n", stu[i].name, stu[i].age, stu[i].score); } // 冒泡排序,按照分数从高到低排序 for (i = 0; i < 2; i++) { for (j = 0; j < 2 - i; j++) { if (stu[j].score < stu[j+1].score) { temp = stu[j]; stu[j] = stu[j+1]; stu[j+1] = temp; } } } printf("After sorting:\n"); for (i = 0; i < 3; i++) { printf("%s %d %.1f\n", stu[i].name, stu[i].age, stu[i].score); } return 0; } ``` 上述代码中,定义了一个结构体类型为 `student`,包含了学生的姓名、年龄和成绩三个字段。然后定义了一个长度为 3 的结构体数组 `stu`,并对其进行初始化赋值。接着使用冒泡排序算法对 `stu` 数组按照成绩从高到低进行排序,并最终输出排好序的结果。 ### 回答2: C语言中的结构体数组赋值可以使用循环遍历的方式进行。首先需要定义一个结构体类型,并声明一个结构体数组变量。 例如,定义一个表示学生信息的结构体类型: ```c struct Student { char name[20]; int age; int score; }; ``` 然后声明一个结构体数组变量: ```c struct Student students[5]; ``` 接下来,可以使用循环遍历的方式为结构体数组变量赋值。可以通过用户输入或者直接给定初始值。 ```c for (int i = 0; i < 5; i++) { printf("请输入第%d个学生的姓名:", i + 1); scanf("%s", students[i].name); printf("请输入第%d个学生的年龄:", i + 1); scanf("%d", &students[i].age); printf("请输入第%d个学生的分数:", i + 1); scanf("%d", &students[i].score); } ``` 以上代码使用循环遍历结构体数组,分别为每个学生输入姓名、年龄和分数,并将输入的值分别赋给对应的结构体数组元素的成员。循环的次数根据结构体数组的大小而定。 通过上述方法,就可以实现 C 语言结构体数组赋值操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值