指针数组和数组指针,二维数组

本文深入探讨了C语言中的二维数组与指针的概念,包括指针数组与数组指针的区别,如何通过指针操作二维数组,以及如何计算二维数组的行平均值和列平均值,提供了丰富的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二维数组

int buf[2][3] = {{1,2,3},{4,5,6}};
int (*p)[3] = buf;
//定义了一个数组指针,指向int[3]这个数组类型,指向二维数组的指针
//int *p[3]; 指针数组

//p++ 指向第二行
printf("%d\n",sizeof(buf));//24
printf("%d\n",sizeof(buf[0]));//12
printf("%d\n",sizeof(p));//4
printf("%d,%d\n",p,p+1);//3996804,3996816 一行12个字节

for(int i = 0; i < (sizeof(buf)/sizeof(buf[0]));i++)
{
    for(int j = 0; j < (sizeof(buf[0])/sizeof(int)); j++)
    {
        printf("%d\n",p[i][j]);
    }
}

以上代码中出现了 两个概念,指针数组数组指针,

指针数组

int *p1[3];   

上面的这种形式构成了一个指针数组,是一个数组,数组名为p1,这个数组中的每个元素的类型都是int *,也就是说该数组包含了3个指向int类型数据的指针

数组指针

nt (*p2)[3];   

上面这种形式构成了一个数组指针,是一个指向数组的指针变量,指针变量名为p2,指向的数组元素类型为int,也就是说定义了一个指向包含3个int类型数据数组的首地址,这个数组在这里没有名字,是个匿名数组。

int arr[3] = { 1,2,3};
int(*p1)[3] = &arr;
/*下面是错误的*/
int(*p2)[3] = arr;
"int *" 类型的值不能用于初始化 "int (*)[5]" 类型的实体

为什么会报错,在上一篇指针与数组中讲过,可以回头在看看。这里正好反过来了。

这里的p1,p2都指向的是整个数组,而不是数组的首元素。

指向二维数组的指针

int buf[3][5]

二维数组名称,buf代表数组首地址

int (*a)[5]

定义一个指向int [5]类型的数组指针变量a

a[0], *(a + 0), *a

0行,0列元素地址

a + 1

第1行首地址

a[1], *(a + 1)

第1行,0列元素地址

a[1] + 2, *(a + 1) + 2, &a[1][2]

第1行,2列元素地址

*(a[1] + 2), *(*(a + 1) + 2), a[1][2]

第1行,2列元素的值 

练习

不允许使用数组下标,只能通过二维数组的指针求出数组中每行和每列的平均值

int buf[3][5] = {{23,33,21,37,56},{23,23,33,88,56},{14,21,64,21,44}};

int *p[5] = buf;

//行平均值
for(int i = 0; i < (sizeof(buf)/sizeof(buf[0])); i++ )
{
    int sum = 0;
    for(int j = 0; j < (sizeof(buf[0])/ sizeof(int));j++)
    {
        sum += *(*(p +i) + j)
    }
    printf("%d\n",sum/(sizeof(buf[0])/ sizeof(int)));
}

//列平均值

for(int i = 0; i < (sizeof(buf[0])/ sizeof(int)); i++ )
{
    int sum = 0;
    for(int j = 0; j <  (sizeof(buf)/sizeof(buf[0]));j++)
    {
        sum += *(*(p + j) + i)
    }
    printf("%d\n",sum/(sizeof(buf)/sizeof(buf[0])));
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值