数组与指针1

本文详细介绍了数组与指针的关系,特别是对一维和二维数组的初始化、使用、访问和操作。一维数组中,数组名既是数组的标识符也是首元素的地址,对数组取地址得到的是数组指针。二维数组本质上是一维数组的数组,访问时可以视为一维数组的指针。文章纠正了关于一维数组取地址的误解,并探讨了&(reference)和*(dereference)在数组中的应用。

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 <stdio.h>

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 <stdio.h>

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 <stdio.h>

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 <stdio.h>

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]的指针,此时指向在第一行首地址。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值