一、数组(Array)的使用
1、数组:具有相同类型的数据的有序集合,并用唯一的名字来标志
2、数组必须直接声明,编译器在编译阶段为其分配内存空间
3、数组所有元素占据连续的内存空间,在内存中是线性存放的,保存数组所需的内存空间直接与基类型和数组长度有关
4、数组占用的内存空间是:sizeof(基类型)*数组长度
5、c不检查数组是否越界,程序可以在两边越界,程序员应自己加入越界检查,初始化时不允许越界
6、向函数传递数组
定义数组形参的方法有三种:指针、定长数组、无尺寸数组
void func1(int *a);
void func2(int a[10]);
void func3(int a[]);
在函数的形参声明中,数组的尺寸无所谓,因为c语言没有边界检查。实际上,在第二种方法编译后,编译器产生的代码就是让函数接受指针,并不生成10个元素的数组
(1)形参中的数组不能再理解为数组,必须理解为指针,不能用sizeof()求大小,但可以再赋值,这与数组名的指针常量性质不一样。传值时有内容的复制,但数组内的元素可能很多,为避免内容的大量复制而占用太多的内存,c规定数组的传参就是穿指针。
(2)int a[][]不能做形参,因为a是指向int[]这样一种数据类型的数组指针,但下标大小没有确定。而int[][8]可以,并可以直接用二维数组名(无须显示转换)做其实参。
7、在处理一个数组的元素时,使用指针自增(p++)的方式通常比直接使用数组下标更快,使程序得以优化
8、c允许定义多维数组,维数上限由编译器定义,但多于三维的数组并不常见,因为多维数组所需的内存空间对维数呈指数增长。并且,计算各维下标会占用CPU时间(存取多维数元素的速度比存取一维数组元素的速度慢)
9、对数组初始化时注意,C89要去必须使用常量初始化代码,C99允许使用非常量初始化字符来初始化本地数组。
二、字符串(String):数组(尤其是一维数组)最常用的地方
1、c没有专门的字符串变量,对于它的操作全部由一维数组实现,字符串是字符数组的一种特殊形式,唯一的区别就在于它是作为一个整体操作,而普通的数组则不能,最终的差别就在末尾的NULL(0)上。
2、初始化操作:要使用字符串常量时把它放到数据区中的CONST区(数据区、全局变量区和静态变量区),用字符串常量初始化字符串数组时有一个复制内容的操作而不仅仅是用一个指针指向它。实际上字符串常量是在常量区还是堆区、采用何种存储结构、以及是否连续的问题,取决于不同的编译器。
3、字符串的输入与输出
下面函数均由
(1)printf("%s",str);
(2)puts(str);
(3)scanf("%s",str);
(4)gets(str);
4、串运算
下面函数均由
(1)strcpy(s1,s2);
把s2所指字符串(源)的内容复制到s1所指的存储空间(目的)中,函数返回s1的值,即目的串的首地址
(2)strcat(s1,s2);
将字符串s2添加到字符串s1的末端,但必须保证字符串s1足够大,以便保存它自己的内容和s2的内容
(3)strlen(str);
计算字符串长度,不包括“\0”在内,返回长度值
(4)strcmp(s1,s2);
比较两个字符串是否相等,相等返回0,s1>s2返回正数,s1
(5)strchr(s1,ch);
功能就是找出在字符串s1中第一次出现字符ch的位置,找到就返回该字符位置的指针(也就是返回该字符在字符串中的地址的位置),找不到就返回空指针(就是 null)。
(6)strstr(s1,s2);
功能就是找出在字符串s1中第一次出现字符串s2的位置(也就是说字符串sr1中要包含有字符串str2),找到就返回该字符串位置的指针(也就是返回字符串str2在字符串str1中的地址的位置),找不到就返回空指针(就是 null)。
5、字符数组、字符指针之间的==比较是地址的比较,结果不可能是true,应用strcmp()函数来比较