c语言进阶——数组类型与数组指针

数组基本概念

元素类型角度:数组是相同类型的变量的有序集合
内存角度:连续的一大片内存空间

数组的初始化

//数组元素的个数可以显式或隐式指定
//数组初始化可以使用{0}或memeset两种方式 
void main()
{
    int a[] = {1, 2};    //隐式指定元素个数 
    int b[100] = {1, 3};//显式指定元素个数 

    int c[200] = {0}; //编译时就已经确定所有值为零
    memset(c, 0, sizeof(c)); //显式的重置内存块数据 
}

数组名的相关解释

  1. 数组首元素的地址和数组地址是两个不同的概念(如有数组int a[10],数组首元素的地址表示为数组名a,数组地址表示为数组名取地址&a)
  2. 数组名代表数组首元素的地址,它是个常量(不能被修改,只读)
  3. 数组首元素的地址和数组的地址值相等(a和&a的值相同,但是步长不同)
    int a[10];
    printf("得到整个数组的地址a: %d \n", &a);
    printf("数组的首元素的地址a: %d \n", a);

自定义数组类型

在c语言中可以使用typedef来重定义数据类型的名称,对于数组这种复杂的数据类型,c语言同样提供了定义标准和规范。

    typedef int (MyArrayType)[5]; //定义了一个数组数据类型,这里MyArrayType = int [5]
    int i = 0;
    MyArrayType  myArray;  //int myArray[5];
    for (i=0; i<5; i++)
    {
        myArray[i] = i+1;
    }
    for (i=0; i<5; i++)
    {
        printf("%d ", myArray[i]);
    }
    printf("myArray代表数组首元素的地址 myArray:%d myArray+1:%d \n", myArray, myArray+1);
    printf("&myArray代表整个数组的地址 &myArray:%d &myArray+1:%d \n", &myArray, &myArray+1);

定义数组指针类型

数组指针就是指向整个数组的指针类型,c语言提供了三种定义数组指针类型的方法

1、第一种方法

    typedef int(MyArray)[5]; //自定义数组类型
    MyArray a; //等价于int a[5]
    MyArray *p; //定义一个指向数组的指针变量p
    p = &a; //把数组a的地址赋给数组指针p
    for (int i = 0; i < 5; i++)
    {
        (*p)[i] = i; //p = &a, *p就等价于a ,所以该表达式等价于a[i]
        printf("%d\n", (*p)[i]);
    }

2、第二种方法

    typedef int (*MyPoint)[5]; //自定义一个数组指针数据类型,编译器分配四字节内存(32位下)
    MyPoint p; 
    int a[5];
    p = &a;
    for (int i = 0; i < 5; i++)
    {
        (*p)[i] = i;
        printf("%d\n", (*p)[i]);
    }

3、第三种方法(推荐)
前两种方法都需要自己进行自定义类型,十分麻烦,因此c语言提供了一种可以直接定义数组指针的方法。

    int (*p)[5];//直接定义一个数组指针,注意与定义指针数组的区别(int *p[5]),[]的优先级大于*
    int a[5];
    p = &a;
    for (int i = 0; i < 5; i++)
    {
        (*p)[i] = i;
        printf("%d\n", (*p)[i]);
    }

猜你喜欢

转载自blog.csdn.net/daidaihema/article/details/80639987