指针与多维数组深度剖析

源码

[[email protected] ch10]# cat zippo11.c

/* zippo1.c --  zippo info */

#include <stdio.h>

int main(void)

{

int b[3]={100,200,300}; int *p;p=b;

printf("b=%p,*b=%d,p=%p,*p=%d,p+1=%p,*p+1=%d \n",b,*b,p,*p,p+1,*p+1);

printf("---------------------------\n");

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)) = %d\n", *(*(zippo+2)));

printf("*(*(zippo+2) + 1) = %d\n", *(*(zippo+2) + 1));

printf("---------------------------\n");

printf("*(*(zippo+1)) = %d\n", *(*(zippo+1)));

printf("*(*(zippo+1) + 1) = %d\n", *(*(zippo+1) + 1));

printf("*(*(zippo)) = %d\n", *(*(zippo)));

printf("*(*(zippo)+1) = %d\n", *(*(zippo)+1));

return 0;

}

结果:

[[email protected] ch10]# ./zippo11

b=0xbfda6dd0,*b=100,p=0xbfda6dd0,*p=100,p+1=0xbfda6dd4,*p+1=101

---------------------------

zippo = 0xbfda6db0,    zippo + 1 = 0xbfda6db8

zippo[0] = 0xbfda6db0, zippo[0] + 1 = 0xbfda6db4

*zippo = 0xbfda6db0,   *zippo + 1 = 0xbfda6db4

zippo[0][0] = 2

*zippo[0] = 2

**zippo = 2

zippo[2][1] = 3

*(*(zippo+2)) = 1

*(*(zippo+2) + 1) = 3

---------------------------

*(*(zippo+1)) = 6

*(*(zippo+1) + 1) = 8

*(*(zippo)) = 2

*(*(zippo)+1) = 4

指针与多维数组深度剖析

时间: 2024-08-28 11:56:25

指针与多维数组深度剖析的相关文章

二级指针与二维数组

最近看<Linux C程序设计大全>这本书,虽然书中有一些错误,但整体来说,书写得还算可以. 当看到网络编程[第23.2.4小节 获得主机信息]时,遇到了一段代码,原文如下: “一台主机有许多和网络相关的信息,例如,主机名称.IP地址.主机提供的服务等.这些信息一般都保存在系统中的某个文件里(例如/etc/hosts等),用户程序可以通过系统提供的函数读取这些文件上的内容.Linux环境下使用gethostent函数读取和主机有关的信息,该函数的原型如下: 1 #include <net

指针和二维数组的关系

指针引用多维数组 int a[3][4] = {{1,3,5,7},{9,11,13,15},{17,19,21,23}};                    二维数组 a[0]  == 1 2 5 7 a[1]  == 9 11 13 15 a[2]  == 17 19 21 23 OK,二维数组在我们眼中,相当于三个一维数组组成:a代表着 二维数组的首地址. 而在二维数组中需要我们特别注意的是 a+1 指向其实是a[1]的地址. 我们在例子中设置的是 “INT” 类型的,在32位 vs中

指针与二维数组间的关系

1.四种表示a[i][j]的形式是等价的: a[i][j]==*(a[i]+j)==*(*(a+i)+j)==(*(a+i))[j] 2.通过行指针p引用二维数组a的元素a[i][j]的方法可用以下4种等价形式: p[i][j]==*(p[i]+j)==*(*(p+i)+j)==(*(p+i))[j] 3.对指向二维数组的行指针p进行初始化的方法: p=a 或p=&a[0] 4.对指向二维数组的列指针进行初始化的方法(以下三种方法等价): p=a[0] 或 p=*a 或 p=&a[0][0

例看二维数组,指针,二维数组指针

例程: /****************************************************** * * 文件名:例程 * * 文件描述:例看二维数组,指针,二维数组指针 * * 创建人:Jesse * * 版本号: * * 修改记录: * ******************************************************/ #include <stdio.h> #define ROW 3 #define LINE 3 void main(voi

图解多级指针与“多维”数组

指针与数组是C/C++编程中非常重要的元素,同时也是较难以理解的.其中,多级指针与“多维”数组更是让很多人云里雾里,其实,只要掌握一定的方法,理解多级指针和“多维”数组完全可以像理解一级指针和一维数组那样简单. 首先,先声明一些常识,如果你对这些常识还不理解,那么你先去弥补一下基础知识: 1.实际上并不存在多维数组,所谓的多维数组本质上是用一维数组模拟的. 2.数组名是一个常量(意味着不允许对其进行赋值操作),其代表数组首元素的首地址. 3.数组与指针的关系是因为数组下标操作符[],比如,int

指针和二维数组

指针和二维数组 首先定义一个数组: 1 int a[5][3] = { {1,6,11}, 2 {2,7,12}, 3 { 3,8,13 }, 4 { 4,9,14 }, 5 { 5,10,15 } 6 }; 随便定义的一个二维数组i = 5, j = 3 然后看下面3种方式: 1 int *b = a[0]; 2 int *c = *a; 3 int &d = **a; 其实上面的三种方式的效果是一样的,大牛一看就知道,这不是废话么.我们还是输出下 1 //value 2 std::cout

typedef 与指针、多维数组

1.在typedef中使用指针往往会带来意外的结果.如下: typedef string *pstring; const pstring cstr; 绝大数人刚开始都会认为cstr是一种指针,它指向const对象,即const pstring cstr 等价于const string *cstr,其实,这是不对的,错误的原因在于单纯地将typedef当做文本扩展了. 首先,我们要认识到pstring它是一个类型,表示的是指向string的指针.声明const pstring时,const修饰的是

图解c/c++多级指针与多维数组

声明:本文转自 chenyang_yao ,欢迎阅读原文. 指针与数组是C/C++编程中非常重要的元素,同时也是较难以理解的.其中,多级指针与“多维”数组更是让很多人云里雾里,其实,只要掌握一定的方法,理解多级指针和“多维”数组完全可以像理解一级指针和一维数组那样简单. 首先,先声明一些常识,如果你对这些常识还不理解,请先去弥补一下基础知识: 1.实际上并不存在多维数组,所谓的多维数组本质上是用一维数组模拟的. 2.数组名是一个常量(意味着不允许对其进行赋值操作),其代表数组首元素的首地址. 3

数组指针与二维数组的寻址

引例:已知如下程序 1 #include <stdio.h> 2 main() 3 { 4 int x[3][4] = {1,3,5,7,9,11,2,4,6,8,10,12} ; 5 int (*p)[4] = x, k = 1, m, n = 0; 6 for(m=0; m < 2; m++) 7 n += *(*(p+m)+k); 8 printf("%d\n",n); 9 } 试写出程序的输出值.(虽然我很讨厌做这种笔头功夫的题,我也坚信编程语言是在实践中练出