| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
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");
 
 - }
 
  复制代码 
         
 
 |   
 
 
 
 |