moc 发表于 2018-8-16 09:24:14

011-一维数组本质及数组类型(指针)

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

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

数组初始化:
        ①数组可以用一个列值来初始化,例如
         int v1[] ={1,2,3,4};
         char v2[]={'a','b','c',0};
        ②当数组定义时没有指定大小,当初始化采用列表初始化了,那么数组的大小由初始化时列表元素个数决定。所以v1和v2分别为 int 和char类型。如果明确指定了数组大小,当在初始化时指定的元素个数超过这个大小就会产生错误。例如:
         char   v3 ={'a','b',0};   //错误:太多的初始化值了
         char   v3 ={'a','b',0};   //正确
        ③如果初始化时指定的的元素个数比数组大小少,剩下的元素都会被初始化为 0。(int 数组会被初始化为0, 字符数组初始化为‘’?)例如
         int   v5={1,2,3,4}等价于 intv5={1,2,3,4,0,0,0,0};
       int   v6 = {0}等价于 int   v6 = {0, 0, 0, 0,0};
       int   v7 = {1}等价于 int   v7 = {1, 0, 0, 0,0};
        ④注意没有如下形式的数组赋值
        v4={'c','d',0};   //错误:不是数组赋值
        ⑤字符数组可以方便地采用字符串直接初始化
         charalpha []="abcdefghijklmn";

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

        也可以定义数组类型(如int)别名(如MyArray5),此时MyArray5就跟int一样啦,是一种类型,也可用它去定义变量:
        typedef int(MyArray5);   // 定义了一种数组类型(int)为MyArray5
        MyArray5 array5;      // 相当于int array;
        for (i=0; i<5; i++)
        {
                array5 = i + 10;
                printf("%d ", array5);
        }
        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);// arrayp5_1 为一个数组类型指针(固定内存块大小的别名)
        arrayp5_1 myp2;    // myp2为指向数组类型的指针变量
3. 直接定义指向(整个)数组的指针变量
        int c = { 1, 2, 43, 2, 11 };
        int(*myp3) = &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时,编译器为了能回收内存,已经把a1做成*const p型指针。

        int a1 = { 1, 2, 43, 2, 11 };   

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

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

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


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

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

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

        }
        system("pause");
}
       

yeastal 发表于 2018-8-16 11:40:48

{:10_256:}{:10_256:}{:10_256:}{:10_256:}
页: [1]
查看完整版本: 011-一维数组本质及数组类型(指针)