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

结果:

相关推荐
野犬寒鸦2 小时前
从零起步学习并发编程 || 第六章:ReentrantLock与synchronized 的辨析及运用
java·服务器·数据库·后端·学习·算法
wenzhangli72 小时前
ooderA2UI BridgeCode 深度解析:从设计原理到 Trae Solo Skill 实践
java·开发语言·人工智能·开源
霖霖总总2 小时前
[小技巧66]当自增主键耗尽:MySQL 主键溢出问题深度解析与雪花算法替代方案
mysql·算法
HalvmånEver2 小时前
Linux:线程互斥
java·linux·运维
rainbow68892 小时前
深入解析C++STL:map与set底层奥秘
java·数据结构·算法
灵感菇_2 小时前
Java 锁机制全面解析
java·开发语言
indexsunny2 小时前
互联网大厂Java面试实战:Spring Boot微服务在电商场景中的应用与挑战
java·spring boot·redis·微服务·kafka·spring security·电商
娇娇乔木2 小时前
模块十一--接口/抽象方法/多态--尚硅谷Javase笔记总结
java·开发语言
saber_andlibert2 小时前
TCMalloc底层实现
java·前端·网络
wangjialelele2 小时前
平衡二叉搜索树:AVL树和红黑树
java·c语言·开发语言·数据结构·c++·算法·深度优先