数组与指针1

1. 一维数组

1.1 本质

数据类型是一种构造类型,内存是一段连续的存储区域。数据类型,决定了连续内存的访问方式,包括起始地址,步长,寻址范围。

1.2 初始化

 int array[10] = {1, 2, 3};  //部分初始化
 int array1[10] = {[3] = 10};
 int array2[10] = {0};  //清零(部分初始化会把其余的元素置0)
 int array3[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 11, 22};    越界不检

1.3 使用

数组名是数组的唯一标识符,数组中的每一个元素都是没有名字的。
数组名有两重含义。

  • 作为数组名时,它是一种构造数据类型
#include 

int main(void)
{
    int array[10];

    printf("&array = %p\n", &array);
    printf("&array+1 = %p\n", &array+1);

    return 0;
}

此时可以观察到结果,&array+1跳跃的是一个int[10]的长度,此时&array是一个数组指针,可以看成是 int (*p)[10],这个指针的步长是int[10].此时对数组名取地址代表访问的是数组整体。

  • 作为访问成员时,它是首元素的地址
#include 

int main(void)
{
    int array[10];

    printf("array = %p\n", array);
    printf("array + 1 = %p\n", array + 1); 

    return 0;
}

此时观察的话,array+1跳跃的是一个int的长度,此时array相当于一个int *的指针,步长为一个int。
array[i] == *(array+i) == i[array]
1.4 错误的认识及纠正

对一维数组取地址(reference),等价于数组指针而不是二级指针.

int array[10];
int (*pa)[10] = &array;     //正确
int **pa = &array;      //错误

1.5 关于&(reference)和*(dereference)

两种操作符代表的是互逆的操作,有些时候可能认为是取地址和取值,但在和数组结合的时候,对一维数组进行&(reference)操作,并不是想当然的二级指针。所以一般认为是引用和解引用。

2. 二维数组

2.1. 本质

二维数组的本质也是一个一维数组,只是数组成员,由基本数据类型变成了构造数据类型(一维数组)

2.2. 初始化

行可以省,列不可以省
部分初始化和清零依然适用

2.3. 访问

  • 作数组名时
#include 

int main(void)
{
    int array[3][4];
    printf("&array = %p\n", &array);
    printf("&array+1 = %p\n", &array+1);

    return 0;
}

当从整体来看的时候,&array代表的是一个二维数组整体的地址,即是一个数组指针int (*array)[3][4],那么此时这个指针的步长即int [3][4],即12个int的跨度。

  • 访问成员时
#include 

int main(void)
{
    int array[3][4];

    printf("array = %p\n", array);
    printf("array + 1 = %p\n", array + 1); 

    return 0;
}

此时差了个int[4]个长度,此时array表示第0行首地址,array+i表示第i行首地址。此时array相当于一个 int(*array)[4]的指针,此时指向在第一行首地址。

你可能感兴趣的:(C,数组,指针)