目录
一、一维数组
(一)一维数组的引用
(二)一维数组在内存中的存放
(三)一维数组的初始化
二、二维数组
(一)二维数组元素的引用
(二)二维数组的内存映射
(三)二维数组的初始化
(四)补充
三、字符数组
(一)字符串和字符串结束标志
(二)字符数组的输入输出
(三)字符串处理函数
1. puts函数
2. gets函数 (尽量少用,字符串有空格时建议用)
3. strlen函数
4. strcat函数
5. strcpy函数
6. strcmp函数
例如: int a[10]; 它表示定义了一个整形数组,数组名为a,有10个整形元素。
① float a[0]; /* 数组大小为0没有意义 */
② int b(2)(3); [ ] /* 不能使用圆括号 */
③ int k, a[k]; /* 不能用变量说明数组大小*/
int a= 5; array[a] = 99; (变量) array[0], array[1], array[2], array[3], array[4] (常量)
1.在定义数组时对数组元素赋以初值。 例如:int a[10]={0,1,2,3,4,5,6,7,8,9};
2. 可以只给一部分元素赋值。例如: int a[10]={0,1,2,3,4}; 只给前面5个元素赋初值,后5个元素值为0。
3. 数组中全部元素值为0,可以写成: int a[10]={0,0,0,0,0,0,0,0,0,0}; 或int a[10]={0}; 不能写成:int a[10]={0*10};
4. 在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组长度。
例如 : int a[5]={1,2,3,4,5}; 也可以写成 int a[]={1,2,3,4,5};
例如:定义a为3×4(3行4列)的数组,b为5×10(5行10列)的数组。
int a[3][4],b[5][10] ;
例如:可以把a看作是一个一维数组,它有3个元素:a[0]、a[1]、a[2],每个元素又是一个包含4个元素的一维数组。
二维数组元素的引用是以数组名开头然后依次指定数组的下标来引用一个元素。
引用形式为: 数组名[第一维下标] [第二维下标]
例如:a[i][j]引用了二维数组a的第i行第j列元素。
二维数组在内存中是按照二维数组元素的下标从小到大的顺序来存储的。
即首先存储二维数组第一行元素中的所有元素,然后依次存储接下来的元素。
上述的二维数组a在内存中的映射如表所示。 这里假设系统为二维数组a分配的内存首地址为BFD5CACC。
内存首地址(16进制) |
数组元素 |
|
BFD5CACC |
a[0][0] |
a[0] |
BFD5CAD0 |
a[0][1] |
|
BFD5CAD4 |
a[0][2] |
|
BFD5CAD8 |
a[1][0] |
|
a[1] |
||
BFD5CADC |
a[1][1] |
|
BFD5CAE0 |
a[1][2] |
数据类型 : 数组名 [常量表达式1][常量表达式2]={ 初始化数据 };
4种方法对二维数组初始化:
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};
3.可以对部分元素赋初值。
例如: int a[3][4]={{1}, {5}, {9}}; //1 0 0 0 5 0 0 0 9 0 0 0
也可以对各行中的某一元素赋初值,
如int a[3][4]={{1}, {0,6}, {0, 0, 0, 11}}; //1 0 0 0 0 6 0 0 0 0 0 11
4.如果对全部元素都赋初值,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。
例如: int a[3][4]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};等价于: int a[ ][4]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
scanf + %d时,enter认为前一个输入结束
+ %s时,enter要用getchar()吸收
sizeof + 地址或指针 都是原来定义的字节数不会改变
sizeof + 数组名称 测量整个数组占用的字节
//一维数组
int array1[10];
printf("sizeof(array1) = %d\n",sizeof(array1)); //40 4*10
//二维数组
int a[3][2];
printf("sizeof(a) = %d\n",sizeof(a));//24 4*3*2
例如:char c[10]; c[0]=′I′ ; c[1]=′ ′; c[2[=′a′; c[3]=′m′; c[4]=′ ′; c[5]=′h′; c[6]=′a′; c[7]=′p′; c[8]=′p′; c[9]=′y′;
对字符数组初始化,可逐个字符赋给数组中各元素。 例如: char c[10]={‘I’, ‘ ’,‘a’,‘m’,‘ ’,‘h’,‘a’,‘p’, ‘p’,‘y’}
为了测定字符串的实际长度,C语言规定了一个“字符串结束标志”——‘\0’。
字符数组的输入输出可以有两种方法:
说明:
(1)用“%s”格式符输出字符串时,printf函数中的输出项是字符数组名,而不是数组元素名。
(2)如果数组长度大于字符串实际长度,也只输出到遇′\0′结束。
(3)输出字符不包括结束符′\0′。
(4)如果一个字符数组中包含一个以上′\0′,则遇第一个′\0′时输出就结束。
(5)可以用scanf函数输入一个字符串%s。(在输入时以空格分隔)
例如:scanf(″%s %s %s″,str1,str2,str3);
输入数据:How are you? 数组中未被赋值的元素的值自动置′\0′。
其一般形式为: puts (字符数组)
其作用是将一个字符串(以′\0′结束的字符序列)输出到终端并加上换行符。
假如已定义str是一个字符数组名,且该数组已被初始化为"China"。则执行puts(str);其结果是在终端上输出China。
用puts函数输出的字符串中可以包含转义字符。
例如: char str[]={″China\nBeijing″};
puts(str);
输出结果: China
Beijing
(空行)
在输出时,将字符串结束标志′\0′转换成′\n′, 即输出完字符串后换行。
其一般形式为:gets(字符数组)
其作用是从终端输入一个字符串到字符数组。该函数值是字符数组的起始地址。
注:1、gets以回车键表示输入结束,scanf以回车键和空格表示输入结束。如输入的字符中含有空格,则使用gets。
2、因为gets函数未能指定缓冲区大小,Linux中将提醒warning: the `gets' function is dangerous and should not be used.
以下 的字符串处理函数需要加入头文件#include
其一般形式为: strlen (字符数组)
strlen是测试字符串长度的函数。
函数的值为字符串中的实际长度(不包括′\0′在内)。sizeof()则包括'\0'
char str[10]={″China″};
printf(″%d\n″,strlen(str)); //5
printf("%d\n", sizeof(str)); //10
其一般形式为:strcat(字符数组1,字符数组2)
Strcat的作用是连接两个字符数组中的字符串,把字符串2接到字符串1的后面,结果放在字符数组1中。
函数调用后得到一个函数值——字符数组1的地址。
char c1[20] = "hello";
char c2[10] = "world";
if(strlen(c1) + strlen(c2) < sizeof(c1)
{
strcat(c1,c2);
printf("%s\n",c1); //helloworld
}
其一般形式为:strcpy(字符数组1,字符串2)
strcpy是“字符串复制函数”。 作用:是将字符串2复制到字符数组1中去。
例如: char str1[10],str2[]={″China″};
strcpy(str1,”china”);
注意:
(1)字符数组1必须定义得足够大,以便容纳被复制的字符串。字符数组1的长度不应小于字符串2的长度。
(2)“字符数组1”必须写成数组名形式(如str1), “字符串2”可以是字符数组名,也可以是一个字符串常量。
如:strcpy(str1,″China″);
(3)复制时连同字符串后面的′\0′一起复制到字符数组1中。
(4)可以用strcpy函数将字符串2中前面若干个字符复制到字符数组1中去。
例如:strncpy(str1,str2,2);作用是将str2中前面2个字符复制到str1中去,然后再加一个‘\0’。
(5)不能用赋值语句将一个字符串或字符数组直接给另一个字符数组。
如: str1=″China″; 不合法
str1=str2; 不合法
char a[5],c1,c2;
c1=′A′; c2=′B′; a[0]=′C′;
a[1]=′h′; a[2]=′i′;
a[3]=′n′; a[4]=′a′;
其一般形式为:strcmp(字符串1,字符串2)
strcmp的作用是比较字符串1和字符串2。
例如: strcmp(str1,str2); strcmp(″China″,″Korea″); strcmp(str1,″Beijing″);
比较的结果由函数值带回
(1) 如果字符串1=字符串2,函数值为0。
(2) 如果字符串1>字符串2,函数值为1。
(3) 如果字符串1<字符串2,函数值为-1。
注意:对两个字符串比较,不能用以下形式:
if(str1>str2) printf(″yes″);
而只能用
if(strcmp(str1,str2)>0) printf(″yes″);