文章目录
零长数组
零长数组,就是长度为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;
}
结果:
