C语言数组:零长数组,可变数组,多维数组

文章目录


零长数组

零长数组,就是长度为0的数组。也叫柔性数组.

数组的长度在编译时是未确定的,在程序运行的时候才确定,甚至可以由用户指定大小。比如,我们可以定义一个数组,然后在程序运行时才指定这个数组的大小,还可以通过输入数据来初始化数组

用途 :主要用途是满足需要变长度的结构体
用法在一个结构体的最后 ,声明一个长度为0的数组,就可以使得这个结构体是可变长的,对于编译器来说,此时长度为0的数字并不占空间,因为数组名本身不占空间,它是一个偏移量,数组名这个符号本身代表了一个不可修改的地址常量

错误用法

c 复制代码
int main(int argc, char const *argv[])
{   
    char my[0];
    strcpy(my,"asjkduhij");
    puts(my);
    return 0;   //单独使用,会报错,因为数组根本就没有空间,也就不能复制到数组里面了
}

正确用法(结合结构体):

c 复制代码
struct student
 {
    int id;//4字节
    int ranking;//4字节
    char name[0];//0字节   //编译器 编译时有个char数组name,malloc 运行时动态分配内存
 };
 int main(int argc, char const *argv[])
{
    
	printf(" struct teacher 占用字节数:%llu\n",sizeof(struct teacher));
    //需要动态分配内存
    struct teacher* tp=(struct teacher*)malloc(sizeof(struct teacher)+sizeof(char)*10);
    tp->id=2021;
    tp->ranking=1;
    strcpy(tp->name,"KKlovecode");
    printf("struct teacher 中name占用字节数:%llu\n",strlen(tp->name));
    free(tp);//释放,必须程序员自己手动释放内存
    return 0;
} 

可变数组

变长数组:使用一个变量作为数组的长度(元素个数);

变长数组并不是说在任意时候它的长度可以随意变化,实际上只是在定义之前数组的长度是未知的一个变量来决定,但是定义语句过后变长数组的长度都由定义那一刻变量的大小来决定。

例如:

c 复制代码
//变长数组:
int main(int argc, char const *argv[])
{
    printf("please input the length of array:\n");
    int len = 0;
    scanf("%d",&len);
    int my[len];
    for (size_t i = 0; i < len; i++)
    {
        my[i]=i;
    }
      for (size_t i = 0; i < len; i++)
    {
        printf("%d",my[i]);
    }
    printf("\n");
    printf("please input the length of array:\n");
    scanf("%d",&len); //此时再尝试改变len的值
    printf("the length of array:%d\n",sizeof(my)/sizeof(my[0]));//看看原先数组的长度大小
    printf("length=%d\n",len);//这是更改之后len的值,值是改后的
    return 0;
}

结果:

第一次输入10之后,数组的长度就变成了10

之后再想改变数组的长度,此时数组的长度并不会改变,虽然变量len的值确实会改变

多维数组

二维数组 :由多个一维数组组成,每个一维数组在内存中连续存储。

定义:

c 复制代码
int array[rows][columns]; // rows 是行数,columns 是每行的列数

初始化与赋值:

c 复制代码
int main(int argc, char const *argv[])
{
    int a[3][4]={{1,2,3,4},{21,22,23,24},{31,32,33,34}};
    //int a[3][4]={1,2,3,4,21,22,23,24,31,32,33,34}; //不要把它当做维,其实它初始化的时候和上面一样
    a[2][1] =33;
    for (size_t i = 0; i < 3; i++)
    {
        for (size_t j = 0; j < 4; j++)
        {
            printf("%d\t",a[i][j]);
        }
        printf("\n");
    }
    return 0;
}

还有一种赋值时不完全赋值:

c 复制代码
int main(int argc, char const *argv[])
{
      //二维数组本质就是由一维数组构成
    int he[3][2]={8,6,5,4};
    for (size_t i = 0; i < 3; i++)
    {   
        //内层控制列
        for (size_t j = 0; j < 2; j++)
        {
            printf("%d ",he[i][j]);
        }
        printf("\n");
    }
    return 0;
}

结果:

亦或者:

c 复制代码
int main(int argc, char const *argv[])
{
      //二维数组本质就是由一维数组构成
    int our[3][2]={{8},{6,5},{4}};
    for (size_t i = 0; i < 3; i++)
    {   
        //内层控制列
        for (size_t j = 0; j < 2; j++)
        {
            printf("%d ",our[i][j]);
        }
        printf("\n");
    }
    return 0;
}

结果:

相关推荐
CoderCodingNo19 小时前
【GESP】C++五级练习题 luogu-P1031 [NOIP 2002 提高组] 均分纸牌
开发语言·c++·算法
好好沉淀19 小时前
ES 脚本核心语法:ctx._source [‘group_id‘]
java·elasticsearch·script
李慕婉学姐20 小时前
【开题答辩过程】以《基于Spring Boot的疗养院理疗管理系统的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·spring boot·后端
tb_first20 小时前
SSM速通2
java·javascript·后端
qq_124987075320 小时前
基于协同过滤算法的运动场馆服务平台设计与实现(源码+论文+部署+安装)
java·大数据·数据库·人工智能·spring boot·毕业设计·计算机毕业设计
大飞哥~BigFei20 小时前
自定义注解记录接口切面log日志入库优化
java
人道领域20 小时前
javaWeb从入门到进阶(maven高级进阶)
java·spring·maven
一路向北⁢20 小时前
Spring Boot 3 整合 SSE (Server-Sent Events) 企业级最佳实践(一)
java·spring boot·后端·sse·通信
风象南20 小时前
JFR:Spring Boot 应用的性能诊断利器
java·spring boot·后端
云小逸20 小时前
【Nmap 设备类型识别技术】整体概况
服务器·c语言·网络·c++·nmap