1、 数组:是一组具有相同数据类型的有序变量的集合,在内存中表现为一块连续的存储区域
2、 数组定义:比普通变量定义后加[常量]
A) 类型标识符:数组名[常量表达式]
B) 错误:[变量]:error C2057: expected constant expression
3、 数组初始化:用{}给数组赋予初值
A) 初始化元素的个数可以不全。(用1到总数个数的常量和变量)
B) 未初始化全,把其余的归零。、
C) 数组清零:chararray[10] = {0};
D) 不指定个数:intarray[] = {2,23,5,6};
4、 求数组空间:
A) sizeof(array) 也可以说是:sizeof(元素)*元素的个数
B) 其数组元素的个数:int I= sizeof(array)/sizeof(int)
C) 在实际的开发中,不直接写数组的个数,而是用求数组个数,以利于总数在发生变化时,遍历数组时不需要修改每一处
D) 除法在编译时运算时常数,不会降低运行效率
E) 最好的求数组元素的个数的方法是:sizeof(array)/sizeof(array[0])
5、 数组元素的调用
A) 任何一个元素都是一个对应类型的变量,可以参与符合该类型的任何运算
B) 表示方法:使用下标[]符号,下标内可以是变量和常量。
C) C语言的越界问题:如果超过定义的数组个数使用数组,就是越界
D) C语言内部没有防止越界,只有程序员通过代码来防止出现
6、 冒泡排序:算法的过程描述如下:
A) 比较相邻的元素,如果前者比后者大,就交换这连个元素
B) 对每一对相邻的元素做同样的工作,从开始第一对到结尾的最后一对
C) 这样循环一轮下来,最终会将数组中最大数值的元素推到数组尾部
D) 针对所有所有元素重复以上步骤,除了最后一个
E) 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较
7、 数组作为参数时:
A) 可以不用指定长度,也可以随便指定任何长度
B) 数组作为参数时性质已经变了,本质上只传递了数组的地址(指针)给形参
C) 数组的空间特征已经消失了,无法通过形式参数获取来源数组的元素个数
D) 无论实参数组有多少个元素,使用sizeof获取形式参数的大小的结果一定是4.(因为任何一个指针变量占用的大小都是4个字节)
8、 字符串数组:是一种特殊的数组:特征是:
A) 必须是char类型的数组
B) 在数组定义的有效空间内,必须含有一个数值是‘\0’的字节
C) ‘\0’作为字符串的结束标志
9、 字符串数组的初始化:
A) 指定元素个数的数组
char str1[10] = {‘a’,’b’};
char str2[10] = “aab”; //不可以超过9个有效字符
B) 不指定个数的字符串数组,根据初始化个数包括‘\0’
Char str3[] = “abcdefg”; //申请??个字节的数组空间
Char str4[] = {‘x’,’y’,’z’,108}; //申请??个字节的数组空间
10、 数组长度和字符串长度:
A) strlen函数:用来计算字符串中有效字符的长度。(不包括结尾符)
B) sizeof:求字符串数组的元素个数,sizeof得出的结果至少比strlen大1以上
C) strlen函数:计算方法是从数组头循环到结尾符’\0’结束,得出的字符串有效字符长度总是小于sizeof得出的数值
D) sizeof:得出的数组长度与数组内没有元素存储的数值无关,而strlen函数返回的字符串长度,与结尾符’\0’在数组中的位置有关
11、 指针的概念
A) 指针的定义:一个内存中变量或者数组变量内存地址就是指针
B) 在32位操作系统中,任何内存变量的地址都是一个0-4g之间的数字
12、 指针变量
A) 指针变量:存放指针(内存地址)的变量称为是指针变量
B) 任何类型的指针变量的空间大小都是4个字节
C) 指针变量记录的内存地址,也称为它指向的地址
13、 指针变量的定义;
A) 变量类型* 指针变量名称[= 地址]
例如:int I = 0; int *p = &I;
B) 同时定义2个以上的指针变量时,每个变量前面都要加*
Int *p1 ,p2; //p2是int类型
Int *p1,*p2;//p2才是int *类型
C)指针变量不可以直接用数字赋值,只有1个数字可以给指针变量赋值:0
14、 指针变量和数组变量的区别
A) 指针变量可以随时指向任何地址,可以++或者—,数组变量的地址是不可变的
B) Sizeof(指针变量)一定是4个字节,数组不一定
15、 指针变量的赋值:
A) 指针变量不可以直接使用整数变量或常量赋值:
例如:int *p = 200; //错误:不能使用整数常量赋值
Int I = 100,*p1 = I; //错误:p1是指针变量,i是整型变量
B) 各种不同种类的指针变量之间不能直接赋值(除非强制转换语句)
例如: int I =10;
Int *p = &I; //正确:类型相同
Char *pc = p; //错误:类型不同
16、 使用*符号对指向的内存地址上的内容进行读写操作
A) 当指针变量指向了某个内存地址,就可以通过*符号或者[]符号,来读写所指向的内存地址上的数据
B) 读写操作的所覆盖的内存空间的长度,要依据这个指针变量的来源类型的长度来决定。(对内存空间进行赋值或者取值)
C) 指针的降级:使用了*符号或者[]符号都能使指针变量降级为它的来源类型
例如:
Int *p = &I; //定义指针变量时使用的*符号
Int j = *p; //调用指针变量操作指向内存地址上的内容使用的*符号
P[0]=10; //就如同数组变量定义时使用的是[],调用元素时使用的也是[]符号,以上的*p和p[0]都降级为了int类型
D)*(p+n) 相当于 p[n] ;//p是一个指针
E)使用*和[]符号取值或者赋值的效果:
Int I = 0x12345678,*p = I;
Char *pc = (char *)p;//强制转化
Printf(“*p = 0x%x , *pc =0x%x\n”,*p,*pc);
Printf(“*p = %d,*pc=%d\n”,p[0],pc[0]);
尽管所有类型的指针变量占用的内存空间都是4个字节,但是不同类型的指针变量到指向的内存地址上取值和赋值的效果是大不相同的。这既是为什么同样是四个字节的变量,当指针变量的类型不同时不能相互赋值的原因
17、 指针的加减运算
A) 指针加减1(++ --):偏移指针的一根来源类型的尺寸(sizeof)
Int I = 888 , a[6]= {11,22,33,44,55,66};
Int *p =a;
++p;//物理上:偏移4个字节,逻辑上:偏移一个int空间
Printf(“a=0x%p,p=0x%p,*p=%d\n”,a,p,*p);
B)指针加减n(+= -=):
P += n;//物理上:偏移4*n个字节,逻辑上:偏移n个int空间
18、 指针法和下标法的对比:
指针变量仍然可以按照数组的取值方式,例如: int *p;
① P[0] 等价于*p;
② P[n] 等价于 *(p+n)
③ 以上两种方法都会降级为来源类型,例如:p[1] 和*p都是int类型
19、 其他指针运算:
A) 两个指针加减:
Int *p1 = &I,*p2 =a;
P1 +p2; //错误:cannot add twopointers
P1 –p2;// 正确:(只能相同类型的指针相减)
//物理上:p1 –p2的结果是6而不是24,是sizeof(int)的整数倍
//逻辑上:两个指针相距6个int空间
B)两个指针变量或者常量比较: == != < >>= <=