二维数组与二维指针(测试环境VS2015)

本文探讨了在C/C++中使用二维数组与指针的方法,重点讲解了不同类型的指针如何指向二维数组,并通过实例演示了如何正确访问二维数组中的元素。

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

二维数组与二维指针(测试环境VS2015)

定义一个二维指针指向二维数组应如下定义:

int num[4][5];
int (*p)[5]=num;

而下面的这种定义在C的编译下是警告(可以成功),但在C++编译下会报错:

int num[4][5];
int **p=num;

C中编译报警告如下(尽管成功,但是可以在C编译环境中看见会有警告,说间接级别不同):

尽管成功,但是可以在C编译环境中看见会有警告,说间接级别不同

而在C++编译则会不成功出现报错(类型不能转换):

类型不能转换

对于二维数组的访问有以下的形式。但是每一种的含义都不同:

> 1.    num[i][j];
> 2.    * ( num[i]+j );
> 3.    * ( *( num+i ) + j );

要理解以上三种形式(第一种就不讲了)就必须理解(&num)、(*num)、(num)所代表的地址含义:

&num:代表的是整个二维数组的起始地址,即num[0][0]的地址,但是此地址指向空间大小为此时num定义的大小为80个字节。

*num:同样代表的是num[0][0]的起始地址,但指向空间代表的大小会有不同,代表是每一行每一列对应的一个元素的大小,即4个字节。

num:也是代表num[0][0]的起始地址,但是这时候空间指向的大小是数组一行的大小,即num数组一行的大小为20字节。

这里 我们做个测试:

#include<stdio.h>
#include<stdlib.h>
void main()
{
    int num[4][5];
    int(*p)[5] = num;

    printf("\n  num[0][0]的地址为: %x", &num[0][0]);
    printf("\n  &num的地址为: %x  &num所对应的大小为%d字节", &num, sizeof( *(&num) ));
    printf("\n  *num的地址为: %x  *num所对应的大小为%d字节", *num, sizeof( **num ));
    printf("\n  num的地址为: %x  num所对应的大小为%d字节", num, sizeof( *num ));

    getchar();
}

结果显示和上述一样:
这里写图片描述

所以可以得到结论:
*num+1会加上四个字节指向下一个元素,而num+1就会加上20字节指向下一行的元素,所以如:*num+1 即指向下一个元素的地址&num[0][1],所以取出对应的值通用表达式就为:

*( *(num+i)+j )

又因为 *(num+i) 可以写出 num[i],所以又可以写成 :

  * (num[i]+j)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值