|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 moc 于 2018-8-16 22:12 编辑
1、数组基本概念
1)元素类型角度:数组是相同类型的变量的有序集合。
2)内存角度:数组是一大片连续的内存空间。
数组初始化:
①数组可以用一个列值来初始化,例如
- int v1[] ={1,2,3,4};
- char v2[]={'a','b','c',0};
复制代码
②当数组定义时没有指定大小,当初始化采用列表初始化了,那么数组的大小由初始化时列表元素个数决定。所以v1和v2分别为 int[4] 和char[4]类型。如果明确指定了数组大小,当在初始化时指定的元素个数超过这个大小就会产生错误。例如:
char v3[2] ={'a','b',0}; //错误:太多的初始化值了
char v3[3] ={'a','b',0}; //正确
③如果初始化时指定的的元素个数比数组大小少,剩下的元素都会被初始化为 0。(int 数组会被初始化为0, 字符数组初始化为‘’?)例如
int v5[8]={1,2,3,4} 等价于 int v5[8]={1,2,3,4,0,0,0,0};
int v6[5] = {0} 等价于 int v6[5] = {0, 0, 0, 0,0};
int v7[5] = {1} 等价于 int v7[5] = {1, 0, 0, 0,0};
④注意没有如下形式的数组赋值
v4={'c','d',0}; //错误:不是数组赋值
⑤字符数组可以方便地采用字符串直接初始化
char alpha []="abcdefghijklmn";
2、复杂数据类型之数组类型
就上面的a代表数组首元素的地址,它是个常量。她的类型是由数组首元素的类型决定的指针类型。
还有一个概念&a,它代表整个数组的地址,其数据类型是数组类型(一种复杂数据类型,其本质依旧是固定内存块旳大小),如(int [10])。
也可以定义数组类型(如int[5])别名(如MyArray5),此时MyArray5就跟int一样啦,是一种类型,也可用它去定义变量:
- typedef int(MyArray5)[5]; // 定义了一种数组类型(int[5])为MyArray5
- MyArray5 array5; // 相当于 int array[5];
- for (i=0; i<5; i++)
- {
- array5[i] = i + 10;
- printf("%d ", array5[i]);
- }
- printf("\n%d\n", sizeof(array5));
- printf("\n%x\n%x\n%x\n%x\n%x",array5, array5+1, array5+4, &array5, &array5+1); //解决指针步长问题
- printf("\n******\n");*\n");
复制代码
可见数组名的类型是数组元素的类型的指针,加1只跳该类型的内存大小;&数组名是数组类型的指针,加1跳整个数组的内存大小。
3、数组类型的指针
数组类型指针定义的三种方法:
1.用数组类型 + * 直接定义;
MyArray5 *myp1;
2.先定义一个指向数组类型的指针类型,再用这个类型去定义数组类型指针;
typedef int(*arrayp5_1)[5]; // arrayp5_1 为一个数组类型指针(固定内存块大小的别名)
arrayp5_1 myp2; // myp2为指向数组类型的指针变量
3. 直接定义指向(整个)数组的指针变量
int c[5] = { 1, 2, 43, 2, 11 };
int(*myp3)[5] = &c; // myp3为指向(整个)数组c的指针变量
- #include "stdlib.h"
- #include "stdio.h"
- #include "string.h"
- void main()
- {
- int a, i;
- int *p = NULL;
- p = &a;
- // a1 代表数组首元素的地址,是(常量)指针变量,即常量指针
- // 不能随便改变指针变量的值, 是一个const ,在定义a[10]时,编译器为了能回收内存,已经把a1做成*const p型指针。
- int a1[5] = { 1, 2, 43, 2, 11 };
- // 声明一个数组类型(固定内存块大小的别名)
- typedef int(MyArray5)[5];
- // 定义一个指向数组类型的指针变量
- MyArray5 *myp1;
- myp1 = &a1; // 给指向数组类型的指针变量赋值
- // 用数组指针遍历数组
- for (i = 0; i < 5; i++)
- {
- printf("%d ",(*(*myp1 + i))); //[]优先级高于*; a[i] == *(a+i)-->(*pArray)[i] == *(*pArray+i)
- }
- {
- // 直接定义一个数组指针类型 用这个类型直接定义指针变量
- typedef int(*arrayp5_1)[5]; // arrayp5_1 为一个数组类型指针(固定内存块大小的别名)
- int b[5] = { 1, 2, 43, 2, 11 };
- arrayp5_1 myp2 = &b; // myp2为指向(整个)数组b的指针变量
- // 直接定义指向(整个)数组的指针变量
- int c[5] = { 1, 2, 43, 2, 11 };
- int(*myp3)[5] = &c; // myp3为指向(整个)数组c的指针变量
- }
- system("pause");
- }
复制代码
|
|