概念:同一类型数据存在连续的存储空间内,C语言不允许对数组的大小做动态定义。
可变长数组:
#include<stdio.h>
int main(){
int n;
scanf("%d",&n);
int a[n];
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
return 0;
}
#include<stdio.h>
void func(int n){
int a[2*n];
for(int i=0;i<2*n;i++)
scanf("%d",&a[i]);
for(int i=0;i<2*n;i++)
printf("%d\n",a[i]);
}
int main(){ func(4)}
不可变长数组:指定了数组的静态存储方式,则不可使用"可变长数组"
#include<stdio.h>
void func(int n){
static int a[2*n];
for(int i=0;i<2*n;i++)
scanf("%d",&a[i]);
for(int i=0;i<2*n;i++)
printf("%d\n",a[i]);
}
//cpp In function 'void func(int)':
//[Error] storage size of 'a' isn't constant
int main(){ func(4)}
初始化:
- 一维数组
- 定义时对全部元素赋值:
int a[10]={1,2,3,4,5,6,7,8,9,10};
2.可以只给部分元素赋值:
int a[10]={1,2,3,4,5};
指定了数组长度并对之初始化,范围被初始化元素,系统会自动初始化为0,字符型初始化为'\0',指针型为NULL
3.可以给数组中全部元素赋0:
int a[5]={0,0,0,0,0};
int a[5]={0};
4.对全部数组元素赋值时,由于数据个数已经确定,因此可不指定数组长度:
int a[5]={1,2,3,4,5};
int a[]={1,2,3,4,5};
- 二维数组
1.分行给二维数组赋值:
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
2.可以将所有数据写在一个花括号内,按数组元素在内存位置赋值:
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int a[3][3]={1,0,2,4};
3.可以对各行中的某几个元素赋值:
int a[3][4]={{1},{0,6},{0,0,1,11}};
int a[3][4]={{1},{5,6}};
int a[3][4]={{1},{},{0,9}};
4.可以对一维进行缺省,但二维必须定义大小
int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int a[][4]={{0,0,3},{},{0,10}};
字符数组:
1.在程序中往往依靠检测 '\0' 的位置来判断字符串是否结束,而不是依靠数组的长度。
2.'\0' ASCII码为0不可显示的字符,是一个空字符。
3.一般默认向字符串后+ '\0'
printf("HOW Do YOU \n");
在向内存中存储时,系统自动在最后一个字符 '\n' 后加一个 '\0' ,作为字符串结束标志。
char c[]={"China"};
printf("%s\n",c);
数组c的存储情况为:
C | h | i | n | a | \0 |
4.字符数组并不一定都含有 '\0' ,甚至可以不含有 '\0' ,也是合法的。
char c[5]={'C','h','i','n','a'}; 例如:
C | h | i | n | a |
5. 在输入多个字符串时 ,以空格为 “ 分隔符 ”
例如:
char str1[5] , str2[5] , str3[5] ;
scanf("%s%s%s",str1,str2,str3);
输入数据:How are you
由于有分隔符,作为3个字符串输入,在输入完后,str1,str2,str3数组状态如下:
H | o | w | \0 | \0 |
a | r | e | \0 | \0 |
y | o | u | \0 | \0 |
由于系统把 “空格符” 作为输入的字符串之间的分隔符,因此只将空格前的字符 “How” 送到 str 中,作为独立的字符串处理。
char str[15];
scanf("%s",str);
输入数据:How are you
由于有分隔符,在输入完后,str 数组状态如下:
H | o | w | \0 | \0 | \0 | \0 | \0 | \0 | \0 | \0 | \0 | \0 | \0 | \0 |