鱼C论坛

 找回密码
 立即注册
查看: 1438|回复: 1

[学习笔记] 011-一维数组本质及数组类型(指针)

[复制链接]
发表于 2018-8-16 09:24:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 moc 于 2018-8-16 22:12 编辑

1、数组基本概念
        1)元素类型角度:数组是相同类型的变量的有序集合。
        2)内存角度:数组是一大片连续的内存空间。
图片1.png

数组初始化:
        ①数组可以用一个列值来初始化,例如
  1.          int v1[] ={1,2,3,4};
  2.          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、复杂数据类型之数组类型
  1. int a[10] = { 1, 2 };
复制代码

        就上面的a代表数组首元素的地址,它是个常量。她的类型是由数组首元素的类型决定的指针类型。
        还有一个概念&a,它代表整个数组的地址,其数据类型是数组类型(一种复杂数据类型,其本质依旧是固定内存块旳大小),如(int [10])。


        也可以定义数组类型(如int[5])别名(如MyArray5),此时MyArray5就跟int一样啦,是一种类型,也可用它去定义变量:
  1.         typedef int(MyArray5)[5];   // 定义了一种数组类型(int[5])为MyArray5
  2.         MyArray5 array5;      // 相当于  int array[5];
  3.         for (i=0; i<5; i++)
  4.         {
  5.                 array5[i] = i + 10;
  6.                 printf("%d ", array5[i]);
  7.         }
  8.         printf("\n%d\n", sizeof(array5));
  9.         printf("\n%x\n%x\n%x\n%x\n%x",array5, array5+1, array5+4, &array5, &array5+1);    //解决指针步长问题
  10.         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的指针变量
  1. #include "stdlib.h"
  2. #include "stdio.h"
  3. #include "string.h"

  4. void main()
  5. {
  6.         int a, i;
  7.         int *p = NULL;
  8.         p = &a;

  9.         // a1 代表数组首元素的地址,是(常量)指针变量,即常量指针
  10.         // 不能随便改变指针变量的值, 是一个const ,在定义a[10]时,编译器为了能回收内存,已经把a1做成*const p型指针。

  11.         int a1[5] = { 1, 2, 43, 2, 11 };   

  12.         // 声明一个数组类型(固定内存块大小的别名)
  13.         typedef int(MyArray5)[5];

  14.         // 定义一个指向数组类型的指针变量
  15.         MyArray5 *myp1;
  16.         myp1 = &a1;   // 给指向数组类型的指针变量赋值

  17.     // 用数组指针遍历数组
  18.         for (i = 0; i < 5; i++)
  19.         {
  20.                 printf("%d ",(*(*myp1 + i)));  //[]优先级高于*; a[i] == *(a+i)-->(*pArray)[i] == *(*pArray+i)
  21.         }


  22.         {
  23.                 // 直接定义一个数组指针类型  用这个类型直接定义指针变量
  24.                 typedef int(*arrayp5_1)[5];  // arrayp5_1 为一个数组类型指针(固定内存块大小的别名)

  25.                 int b[5] = { 1, 2, 43, 2, 11 };
  26.                 arrayp5_1 myp2 = &b;    // myp2为指向(整个)数组b的指针变量

  27.                 // 直接定义指向(整个)数组的指针变量
  28.                 int c[5] = { 1, 2, 43, 2, 11 };
  29.                 int(*myp3)[5] = &c;     // myp3为指向(整个)数组c的指针变量

  30.         }
  31.         system("pause");
  32. }
复制代码

       

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-16 11:40:48 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-26 00:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表