int age1 = 20;
int age2 = 21;
int age3 = 23;
......
管理多个同类信息,----->数组
数组是由数据类型一致的元素构成的
一:数组的定义:
1) 数据存储 数据类型 数组名 [ 元素的总数 ] ;
int arr [ 10 ];
定义一个由10个int类型的数据组成的数组变量;
如果是局部变量的话,初始值为随机数;
全局变量的话,初始值是全0;
数组变量对应的数组名就是arr ;
2) 数据存储 数据类型 数组名 [ 元素的总数 ] = { 元素初始值 } ;
int arr [ 10 ] ={11,22,33,44,55,66,77,88,99,100};
定义一个由10个int类型的数据组成的数组变量,数组里面的元素一次性被赋上了初始值
只有在定义数组的时候,才能一次性为所有元素赋值
int arr [ 10 ] ={11,22,33,44,55,66,77 };
等价于 {11,22,33,44,55,66,77 , 0 ,0 ,0};
只要在定义的时候有为部分元素赋值,其它元素的值会被自动赋为0
int arr [ 10 ] ={0 };
等价于10个0;
3) 数据存储 数据类型 数组名 [ ] ={ 元素初始值 };
定义时缺省元素个数,由系统自动根据所赋的初值来计算出元素个数
int arr [ ] = { 11,22,33,44,55};
等价于定义一个由5个int类型的数据组成的数组变量,
二:数组的使用
1) 使用数组的下标来访问对应的元素 arr[i]
非数组定义时,数组名[i] 这里的是i表示对应的下标从0开始计算的
有N个元素的数组,下标的有效范围{0 ~ N-1}
int arr [ 5 ] = { 11,22,33,44,55}; // 定义
11 -----> arr[0]
22 -----> arr[1]
33 -----> arr[2]
44 -----> arr[3]
55 -----> arr[4]
arr[5] 数组下标越界,编译的时候不会报错,
但是不确定后果
如果希望修改数组里全部元素的值,不可以再一次性赋值了
arr [ 5 ] = {100 ,101,102,103,104}
只能逐个元素进行赋值
数组和for循环是个绝配
for(i=0 ; i<5 ; i++ ) // 通过i 的值得变化,访问数组中的元素
{
//i{0...4}
arr[i] = 100+i;
}
2) 使用数组名 arr
int arr[5] ; // 首元素是arr[0]
数组名就是arr, 在通常情况下表示的是数组中的首元素的地址
arr ====&arr[0]
只有和以下两个运算符组合在一起的时候例外
sizeof ( arr ) ---- 表示整个数组的占用空间字节数
&arr ---- 整个数组的地址
如: int arr[ ] = {11,22,33};
int min;
min= arr[0]
for(i=0; i< sizeof(arr) / sizeof(arr[0]) ; i++)
// 数组占用字节数/某元素的字节数 ==》元素的个数
三:可变数组
在编译程序的时候,还不知道数组的元素个数,但是是确定数组类型和数组名,此时不能给可变数组赋初值;
直到程序运行到代码定义数组的语句之前,元素的个数才被确定下来
int length ;
scanf("%d",&length); 在运行到可变数组定义前,必须得到数组的元素个数
int array[length] ;//order~
四:字符数组
由char 类型的数据组成的数组
char arr[10] ;
char arr[10] = “hello”;
char arr[10] = {‘h’, ’e’, ’l’, ’l’, ’o’, ‘\0’ , 0, 0, 0, 0} ;
char array[10] = {‘h’, ’e’, ’l’, ’l’, ’o’, ‘a’ , ‘b’, ‘c’, ‘d’, ‘e’} ; // 定义是没有问题的,
这个array不适合当成字符串来做操作了,一般是逐个元素的访问
{1,2,3,4,5,6,7,8,9,10};
‘\0’是“”自带的,通常我们需要对字符数组进行整体操作的时候,会用上’\0’
我们通常习惯字符串后面的自带’\0’
char a[ ] = “hello” ; 这个字符数组一共占用了6个 ‘h’, ’e’, ’l’, ’l’, ’o’, ‘\0’
char a[ ] = {‘h’, ’e’, ’l’, ’l’, ’o’} ; 这个字符数组一共占用了5个
练习:使用键盘给字符数组赋值%s,且把每个字符数组的元素都用%c逐个打印出来,
需要用空格隔开
char arr[100]; // random
inti;
scanf("%s", arr) ;//scanf("%s", &arr[0])
// for(i=0; i<100 ; i++)
for(i=0; arr[i]!='\0' ;i++)// 类似%s 只要在内存中遇到了’\0’就停止打印
{
printf("%c",arr[i]); // 只会显示有效字符
}
scanf("%s" , arr);
等价于scanf("%s" , &arr[0]);
把键盘缓冲区中的字符依次放在数组arr的首元素开始的空间,
直到遇到空格或者换行符停止,同时增加一个"\0"
如果要输入带空格的字符串,可以用scanf(“%[^\n]”, arr);
或者是 fgets(arr , 100 , stdin);
scanf("%c", &arr[0]);
只是放置一个字符到首元素地址
printf("%s" , arr);
等价于printf("%s" , &arr[0]);
从地址&arr[0]开始逐个取字符并打印,遇到了‘\0’就停止打印
printf("%c", arr[i])
打印对应的一个字符
sizeof(arr) 表示整个数组的占用空间字节数
strlen(arr) 函数,可以返回数组的有效字符数,也就是基于arr到‘\0’为止
练习:从键盘输入一个可变长度字符串,统计这个字符串中小写字母的个数
且把每个小写字母都打印出来
参考var_array.c 定义可变长度字符串
char_array3.c
******************
字符数组 %c通过下标逐个操作元素,
%s是访问数组名,基于首元素地址开始操作数组
******************
错误~:
char_array3.c:13:9: warning: format ‘%s’ expects argumentof type ‘char *’, but argument 2has type ‘int *’ [-Wformat=]
‘%s’这个格式需要的类型是char *(char类型数据的地址),但是第二个参数是int类型数据的地址