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

结果:

相关推荐
LeetCode天天刷2 小时前
1348 推文计数【区间】
java·服务器·windows
0***m8222 小时前
MATLAB高效算法实战技术文章大纲向量化运算替代循环结构
开发语言·算法·matlab
AY呀2 小时前
《从赛车到代码:我是如何理解深度优先搜索的》
算法
不知名XL2 小时前
day22 回溯算法part04
算法·leetcode·职场和发展
NE_STOP2 小时前
SpringBoot+shiro+jwt前后端分离鉴权
java
小当家.1052 小时前
JVM/八股详解(下部):垃圾收集、JVM 调优与类加载机制
java·jvm·面试
szm02252 小时前
Java并发
java·开发语言
夏鹏今天学习了吗2 小时前
【LeetCode热题100(77/100)】杨辉三角
算法·leetcode·职场和发展
1***43802 小时前
MATLAB高效算法实战技术文章大纲工程领域的应用背景
开发语言·算法·matlab