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;
}

结果:

相关推荐
Flynt2 小时前
把公司项目迁到 Spring Boot 4.0:编译通过只是开始
java·spring boot·后端
2601_965742222 小时前
全媒体运营与短视频代运营,两者有什么区别?
大数据·数据结构·人工智能·算法·ai·媒体
Tangyuewei2 小时前
给老 Spring 项目装个 AI Agent
java·人工智能·spring
她的男孩2 小时前
多租户和数据权限怎么共存?扒完拦截器注册链路,我找到 4 个隐蔽的坑
java·后端·架构
wordbaby3 小时前
混合检索:两全其美的艺术
人工智能·算法
小溪学编程3 小时前
Java BufferedReader 详解:从基础用法到性能优化
java·python·性能优化
彧azz3 小时前
数据结构:关于图的学习
c语言·数据结构·笔记·学习·算法
HZero.chen3 小时前
Java 匿名类简介
java·匿名类
热心网友俣先生3 小时前
A题-药材的烘干问题-题意逐句翻译
算法·数学建模
用户3126874877203 小时前
Java 泛型擦除到底擦掉了什么?类型安全与桥接方法深度拆解
java