二维数组居然是个类似于二级指针(pointer to pointer)的东西,十分震惊!

 #include <stdio.h>
int main()
{
int a[][]={{,,,},{,,,},{,,,}};
printf("&a:%d,&a[0]:%d \n",&a,&a[]);
printf("a:%d,a[0]:%d \n",a,a[]);
printf("*a:%d,*a[0]:%d \n",*a,*a[]);
printf("**a:%d \n",**a);
return ;
}

运行结果:

&a:2686672,&a[0]:2686672
a:2686672,a[0]:2686672
*a:2686672,*a[0]:1
**a:1

由此可见 a[0][0]是一个整型变量,a[0]是一个指针(pointer),a是个二级指针(pointer to pointer)

并且a,a[0],a[0][0]的地址是相同的,但a依然是指向a[0]地址的指针,a[0]依然是指向a[0][0]的指针

因此二维数组的操作也变复杂点了,以下一道题用以验证及训练

设有如下数组定义: int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}}; 计算下面各项的值(设一个int类型数占四个字节)。

(1)a[2][1]		(2)a[1]		(3)a			(4)a+1
(5)*a+1 (6)*(a+1) (7)a[2]+1 (8)*(a+1)+1
(9)*(*(a+2)+2)
 #include <stdio.h>
int main()
{
int a[][]={{,,,},{,,,},{,,,}};
printf(" a[1]:%d \n a:%d \n *a:%d \n a+1:%d \n *a+1:%d \n *(a+1):%d \n a[2]+1:%d \n *(a+1)+1:%d \n",a[],a,*a,a+,*a+,*(a+),a[]+,*(a+)+);
printf(" *(*(a+2)+2):%d \n",*(*(a+)+));
return ;
}

运行结果:

a[1]:2686688
a:2686672
*a:2686672
a+1:2686688
*a+1:2686676
*(a+1):2686688
a[2]+1:2686708
*(a+1)+1:2686692
*(*(a+2)+2):21

小结:

二级指针 指针     整型变量

a    →    a[0] → a[0][0]

a[1] → a[1][0]

a[2] → a[2][0]


可以推广到一维数组就是一个指针,三维数组是个三级指针了

验证一维数组是指针(pointer)

 #include <stdio.h>
int main()
{
int a[]={,,};
printf("&a:%d,&a[0]:%d \n",&a,&a[]);
printf("a:%d,a[0]:%d \n",a,a[]);
printf("*a:%d \n",*a);
return ;
}

运行结果:

&a:2686708,&a[0]:2686708
a:2686708,a[0]:1
*a:1

二维数组是二级指针pointer to pointer!的更多相关文章

  1. C语言复习---二维数组和二级指针的关系:没关系,别瞎想(重点)

    前提:一维数组和一维指针为什么可以替换使用? ] = { , , }; int *p = a; ; i < ; i++) printf("%d ", *(p + i)); 上 ...

  2. C++ 二维数组(双重指针作为函数参数)

    本文的学习内容参考:http://blog.csdn.net/yunyun1886358/article/details/5659851 http://blog.csdn.net/xudongdong ...

  3. C语言笔记(二维数组与数值指针)

    一.关于二维数组和二维数组区别 (1)一维数组在内存中是连续分布存储的,同样,二维数组也是在内存连续存储的.所以从内存的角度来分析,一维数组和二维数组其实没有本质区别. (2) 二维数组可以使用一维数 ...

  4. C语言二维数组中的指针问题

    #include "stdio.h" void main() { int a[5][5]; int i,j; for (i=0;i<5;i++) { for (j=0;j&l ...

  5. 论C语言中二级指针和二维数组之间的区别

    刚开始学习C语言的时候,觉得一个数组可以定义一个一级指针去访问,想当然的就觉得可以定义一个二级指针去访问二维数组.很显然这是错误的. 我们来看看C语言的数组在内存中的存储方式. 实际上C语言中的数组, ...

  6. C/C++二维数组名和二级指针

    转载 :https://blog.csdn.net/wu_nan_nan/article/details/51741030  作者:吴一奇 1. 指针1.1 一个指针包含两方面:a) 地址值:b) 所 ...

  7. [转] C语言多维数组与多级指针

    http://c.biancheng.net/cpp/html/477.html 多维数组与多级指针也是初学者感觉迷糊的一个地方.超过二维的数组和超过二级的指针其实并不多用.如果能弄明白二维数组与二级 ...

  8. C/C++怎样传递二维数组,转载自CSDN

    用二维数组作为参数传递(用二维数组处理矩阵),但是希望接受传递二维数组参数的函数可以处理任意维度的数组(希望矩阵的行数和列数都是不固定的). [以下转帖] ---------------------- ...

  9. C/C++如何传递二维数组?

    用二维数组作为参数传递(用二维数组处理矩阵),但是希望接受传递二维数组参数的函数可以处理任意维度的数组(希望矩阵的行数和列数都是不固定的). ----------------------------- ...

随机推荐

  1. 再看GS线程

    再看GS线程 void GameServer::ProcessThreadTry() { ; packet rcvPkt; rcvPkt.data = * ]; //该事件工厂主要创建了两个定时器1. ...

  2. 【BZOJ4605】崂山白花蛇草水 权值线段树+kd-tree

    [BZOJ4605]崂山白花蛇草水 Description 神犇Aleph在SDOI Round2前立了一个flag:如果进了省队,就现场直播喝崂山白花蛇草水.凭借着神犇Aleph的实力,他轻松地进了 ...

  3. CF(439E - Devu and Birthday Celebration)莫比乌斯容斥

    题意:将n个糖果插入f-1个挡板分成f分(a1,a2,a3...af). 问有多少种分法能够使得gcd(a1,a2,a3...af)=1; 解法.莫比乌斯容斥,首先按1为单位分,这时候有C(n-1,f ...

  4. .htaccess技巧: URL重写(Rewrite)与重定向(Redirect) (转)

    目录 Table of Contents 一.准备开始:mod_rewrite 二.利用.htaccess实现URL重写(rewrite)与URL重定向(redirect) 将.htm页面映射到.ph ...

  5. Elasticsearch5 及 head插件 安装说明

    Elasticsearch5.X及 head插件 安装说明: 1.下载elasticsearch安装文件: a) 下载官方源码: https://artifacts.elastic.co/downlo ...

  6. Cmder配置

    中文乱码和重叠 当我们使用ls命令查看文件目录时,发现,中文被显示成了一些奇怪的乱码,将以下几行代码配置在cmder/config/user-aliases下即可解决问题: l=ls --show-c ...

  7. 如何浏览github上所有的公开的项目?

    github 上面项目多如牛毛,没有维护的.没有意义的或太过偏门的项目也是数不胜数,所以直接按照字母或者更新顺序浏览实在没什么意义. 有一个做法是去 github 搜 awesome list,比如通 ...

  8. hibernate 一对多 级联 保存修改 删除

    一对多,一端设置: <set name="TWorkorderHistories" inverse="true" cascade="all&qu ...

  9. Python爬虫 —— 抓取美女图片

    代码如下: #coding:utf-8 # import datetime import requests import os import sys from lxml import etree im ...

  10. 深入理解JVM - 垃圾收集器与内存分配策略 - 第三章

    引用计数算法——判断对象是否存活的算法 很多教科书判断对象是否存活的算法是这样的:给对象添加一个引用计数器,每当一个地方引用它时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器为0的对象 ...