指针和多维数组

我们在前面使用const创建过变量

const double  PI =3.14159;

#define可以创建类似功能的符号常量,但是const的用法更加灵活,可以创建const 数组 const指针和指向const 的指针。

我们使用最小的数组,假设有下面的声明

int zippo[4][2];//内涵int 数组的数组

然后数组名zippo是该数组首元素的地址,在本列中,zippo的元素首要是一个内涵两个int 值的数组,所以zippo是这个内涵两个int值的地址。

因为zippo是数组首元素的地址,所以zippo的值和 &zippo[0]的值相同。而zippo[0]本身是一个内涵两个正式的数组,所以zippo[0]的值和他首元素(一个整数)的地址(&zippo[0][0]的值)相同。简而言之,zippo[o]是一个占用一个int对象大小的地址二zippo是一个占用两个int大小对象的地址。由于整数和内涵连个数组都开始于同一个地址,所以zippo和zippo[0]的值相同。

给指针或地址加1,其值会增加对应类型大小的数组。在这方面,zippo和zippo[0]不同,因为zipppo指向对象占用了两个int 大小,而zippo[0]只想的对象只占用了一个int大小,因此zippo+1和zippo[0]+1的值不同。

解引用一个指针(在指针前运用*运算符)或在数组后使用带下标的[]运算符,得到引用对象代表的值,因为zippo[0]是该数组首元素(zippo[0][0])的地址,所以*(zippo[0]表示储存在zippo[0]上的一个值。

//zippol.c--与zippo相关的函数
#include <stdio.h>
int main(void)
{
    int zippo[4][2] = { {2,4},{6,8},{1,3},{5,7} };
    printf("zippo=%p,zippo+1=%p\n", zippo, zippo + 1);
    printf("zippo[0]=%p,zippo[0]+1=%p\n", zippo[0], zippo[0] + 1);
    printf("*zippo=%p,*zippo+1=%p\n", *zippo, *zippo + 1);
    printf("zippo[0][0]=%d\n", zippo[0][0]);
    printf("*zippo[0]=%d\n", *zippo[0]);
    printf("**zippo=%d\n", **zippo);
    printf("zippo[2][1]=%d\n", zippo[2][1]);
    printf("*(*(zippo+2)+1)=%d\n", (*(*(zippo + 2) + 1)));
    return 0;
}
运行结果如

其他系统显示的地址值和地址形式可能不同,但是地址之间的关系与以上输出相同。该输出显示了一堆数组zippo的是和一堆数组zippo[0]的地址相同,他们的地址都是各自数组首元素的地址,因而与&zippo[0][0]的值也相同。

zippo   二维数组首元素的地址(每个元素都是内涵两个int类型元素的一维数组)

zippo+2  二维数组的第三个元素(既一位数组的地址)

*(zippo+2)   二维数组的第三个元素(既一位数组)的首元素(一个int类型的值)的地址

*(zippo+2)+1     二维数组第三个元素(既一维数组)的第二个元素(也是一个int类型的值)地址

*(*(zippo+2)+1)    二维数组的第三个一维数组元素的额第二个int类型元素的的值,既数组的额第三行第二列的值

上面的而分析是为了说明用指针表示法(*(*(zippo+2)+1))代替数组表示法(zippo[2][1]),而是提示读者,如果程序恰巧使用一个指向而位数组的指针,而且要通过该指针获取值时,最好用简单的 数组表示法,而不是指针表示法。

指向多维数组的指针

指针的兼容性

函数和多维数组

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值