指针和多维数组

来源:互联网 发布:淘宝哪里申请商标认证 编辑:程序博客网 时间:2024/05/17 22:26

受害于之前看书不认真,而且懒于动手,今天遇到指针和多维数组的问题时又再次翻书查找相关的知识,这次记下一些以前没有记得的内容。

 

参考:C Primer Plus  267页  10.7指针和多维数组。其中,程序zippo1.c略微改动。

 

int zippo [4][2]; //声明一个二维数组

多维数组数组名和地址的关系:

1,  一维数组中这个关系可以简单的描述为 数组名就是数组首元素的地址。但是多维数组相对一维数组有更加深刻的含义,例如,zippo是这个数组的数组名,zippo就是数组首元素的地址,这时的数组,包含4个元素,每个元素都是包含两个int 类型的数组,所以首元素地址为&zippo[0],则zippo=&zippo[0].

2,  对于数组中的每一个元素(例如zippo[0]),又是一个包含两个int 类型元素的数组,则同理得到zippo[0]=&zippo[0][0].简单的说来,zippo[0]是一个整数大小对象的地址,而zippo是两个整数大小对象的地址。因为整数和两个整数组成的数组开始于同一个地址,所以就有了zippo和zippo[0]具有相同的数值。

3,  对指针+1,加上的是一个类型大小的数值,zippo[0]是一个整数大小对象的地址,而zippo是两个整数大小对象的地址。则zippo[0]+1和zippo+1的结果不同,zippo[0]+1等于加上一个int 类型大小的值,zippo+1等于加上两个int 类型大小的值。

4,  *zippo[0]指的是元素zippo[0]中的第一个元素的值,就是zippo[0][0]中的值,是一个int 类型的值,但是*zippo 代表首元素zippo[0]的值,但zippo[0]是一个int数的地址,zippo[0]=&zippo[0][0],所以,*zippo=&zippo[0][0],则可以进一步得到**zippo=*&zippo[0][0],所以,zippo是地址的地址,它的值,是一个地址。

 

程序代码及结果事例:

#include<stdio.h>int main(void){    int i,j;    int zippo[4][2]={{1,2},{3,4},{5,6},{7,8}};    printf("sizeof(int)=%d\n",sizeof(int));    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=%d,*zippo+1=%p\n\n",*zippo,**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\n",*(*(zippo+2)+1));    for(i=0;i<4;i++)        for(j=0;j<2;j++)           printf("zippo[%d][%d]=%d,&zippo[%d][%d]=%p\n",i,j,zippo[i][j],i,j,&zippo[i][j]);    getchar();    return 0;}

结果截图: