二维数组居然是个类似于二级指针(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. EasyPlayerPro(Windows)流媒体播放器开发之ffmpeg log输出报错

    EasyPlayerPro主要基于ffmpeg进行开发,在EasyPlayerPro开发过程中,曾遇到一个相对比较棘手的问题,该问题一般在播放不是很标准的流或者网络情况较差,容易出现丢帧的情况特别容易 ...

  2. HTML5+ Android打包证书

    HBuilder默认App云端打包默认使用的是DCloud公用证书,其信息如下: MD5: 59:20:1C:F6:58:92:02:CB:2C:DA:B2:67:52:47:21:12 SHA1:B ...

  3. 【题解】P4799[CEOI2015 Day2]世界冰球锦标赛

    [题解][P4799 CEOI2015 Day2]世界冰球锦标赛 发现买票顺序和答案无关,又发现\(n\le40\),又发现从后面往前面买可以通过\(M\)来和从前面往后面买的方案进行联系.可以知道是 ...

  4. Java for LeetCode 129 Sum Root to Leaf Numbers

    Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number ...

  5. Java for LeetCode 093 Restore IP Addresses

    Given a string containing only digits, restore it by returning all possible valid IP address combina ...

  6. mysql的安装与基本管理

    MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下公司.MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是最好的 RDBMS ...

  7. IOS AFNetWorking 设置超时时间

    (原创经验总结) 1.关于AF 超时的说法 系统默认的timeInterval  是60s  ASI默认是10s 但是有一个说法是 AF “AFN在GET条件下设置的NSURLRequest能起作用, ...

  8. centos下安装wordpress

    https://www.jianshu.com/p/2439dc2187b2 https://blog.csdn.net/liuhelong/article/details/79924014

  9. Appium——api常用函数

    appium常用函数介绍:   获取页面信息:   1. def get_current_activity(cls, driver): ''' 获取当前页面的activity :param drive ...

  10. 51nod1671【货物运输】

    开始天真的我以为这道题和运输计划是一样的套路.于是写了一发,debug后发现过了第一个点,十分开心的交了一发,结果只过了第一个点.后来发现这个并不是一样的,因为修建黑洞之后路径法变了,而运输计划没有( ...