必威体育Betway必威体育官网
当前位置:首页 > IT技术

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

时间:2019-09-07 07:40:00来源:IT技术作者:seo实验室小编阅读:72次「手机版」
 

结构体数组

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

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

运行结果:

这里写图片描述

相关阅读

世界语言对照表

世界语言对照表注:部分小语种存在编译器不能兼容显示语言码_国家码 -> 语言选择里的显示语言 -> 英文下的语言(国家) -> 简体中文

C语言经典面试题 与 C语言面试宝典

1预处理 问题1:什么是预编译?何时需要预编译?答:预编译又称预处理,是整个编译过程最先做的工作,即程序执行前的一些预处理工作。主要处

2019年1月编程语言排行榜

Python 编程语言赢得了“2018年度编程语言”的称号!Python 能获得这个称号,是因为在 2018 年相较于其他的语言,它的增长更加明显。Py

c语言中的creat()函数使用及参数详解

头文件:#include <sys/types.h>   #include <sys/stat.h>   #include <fcntl.h> #include <fcntl.h>           

讯飞输入法“方言发音人招募” 保护濒危语言提升方言

在许多人心中,一句句方言、一声声乡音,连接着一份份情感与一段段回忆。&ldquo;乡音无改,你想把亲切的乡音留存下来吗?&rdquo;6月12日

分享到:

栏目导航

推荐阅读

热门阅读