C语言二级指针与数组

本文探讨了C语言中二维数组与指针之间的关系。通过代码示例展示了矩阵地址、指针加法以及元素访问的不同方式,解释了它们在内存布局上的差异。例如,matrix表示二维数组的首地址,而matrix+1则指向下一个数组的起始位置。理解这些概念对于深入学习C语言的内存管理和数组操作至关重要。
摘要由CSDN通过智能技术生成

先看一段代码:

#include <stdio.h>

int main() {
    int matrix[2][5] = {{1, 2, 3, 4, 5},
                        {6, 7, 8, 9, 10}};
    printf("matrix=%p\t,matrix+1=%p\n", matrix, matrix + 1);
    printf("matrix[0]=%p\t,matrix[0]+1=%p\n", matrix[0], matrix[0] + 1);
    printf("*matrix=%p\t,*matrix+1=%p\n", *matrix, *matrix + 1);
    printf("&matrix[0]=%p\t,&matrix[0]+1=%p\n", &matrix[0], &matrix[0]+1);
    printf("&matrix[0][0]=%p\t,&matrix[0][0]+1=%p\n", &matrix[0][0], &matrix[0][0]+1);
    printf("matrix[0][0]=%d\n", matrix[0][0]);
    printf("*matrix[0]=%d\n", *matrix[0]);
    printf("**matrix=%d\n", **matrix);
    printf("matrix[1][1]=%d\n", matrix[1][1]);
    printf("*(*(matrix+1)+1)=%d\n", *(*(matrix + 1) + 1));
    printf("*((*matrix+1)+1)=%d\n", *((*matrix + 1) + 1));
    return 0;
}



输出:

matrix=0061FEA8 		,matrix+1=0061FEBC
matrix[0]=0061FEA8      ,matrix[0]+1=0061FEAC
*matrix=0061FEA8        ,*matrix+1=0061FEAC
&matrix[0]=0061FEA8     ,&matrix[0]+1=0061FEBC
&matrix[0][0]=0061FEA8  ,&matrix[0][0]+1=0061FEAC
matrix[0][0]=1
*matrix[0]=1
**matrix=1
matrix[1][1]=7
*(*(matrix+1)+1)=7
*((*matrix+1)+1)=3

虽然数值上,matrix=matrix[0]=*matrix=&matrix[0]=&matrix[0][0],但是含义却不同。
1、matrix表示一个特殊的数组指针,数组中的每个元素又是一个数组,这个特殊数组含有2个元素,每个元素占用字节为BC-A8=14h=20,即4×5=20,matrix+1,则指针地址数值+20
2、matrix[0]表示一个普通的一维数组指针,数组中含有5个元素,每个元素占用4个字节,数组总长度为20个字节,matrix[0]+1,则指针地址值+4
3*matrix=matrix[0]=&matrix[0][0]
4、matrix=&matrix[0]
5、遍历二维数组中每个元素,使用*(*(matrix+i)+j),i表示行,j表示列
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

karwen2020

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值