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。因此,获得数组长度,只能在数组定义所在的代码区中,采用上述简便方法,才可以达到效果。
运行结果:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/engerla/article/details/79900529