转载 :https://blog.csdn.net/wu_nan_nan/article/details/51741030  作者:吴一奇

1. 指针
1.1 一个指针包含两方面:a) 地址值;b) 所指向的数据类型。

1.2 解引用操作符(dereference operator)会根据指针当前的地址值,以及所指向的数据类型,访问一块连续的内存空间(大小由指针所指向的数据类型决定),将这块空间的内容转换成相应的数据类型,并返回左值。

有时候,两个指针的值相同,但数据类型不同,解引用取到的值也是不同的,例如,

	char str[] ={0, 1, 2, 3};       /* 以字符的ASCII码初始化 */

	char * pc = &str[0];		/* pc指向str[0],即0 */

	int * pi = (int *) pc;		/* 指针的“值”是个地址,32位。 */

  

此时,pc和pi同时指向str[0],但*pc的值为0(即,ASCII码值为0的字符);而*pi的值为50462976。或许把它写成十六进制会更容易理解:0x03020100(4个字节分别为3,2,1,0)。我想你已经明白了,指针pi指向的类型为int,因此在解引用时,需要访问4个字节的连续空间,并将其转换为int返回。

2. 数组
2.1 数组名和指针

通常我们认为数组名是一个指针常量(例如,int a[10]; 那么a是一个int * const),这种理解是不全面的,正确的理解如下:

作为右值(例如,赋值语句右边)时数组名可视为指针常量(系统自动转换);作为左值,例如取地址,sizeof,则不能视为指针。

sizeof(一个数组)返回的是数组大小*每个元素占字节数;而sizeof(一个指针)返回4。

2.2 二维数组

实际上,不管是一维还是多维数组,都是内存中一块线性连续空间,因此在内存级别上,其实都只是一维。

做如下定义:

	int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};

	int ** p;

	p = (int**)a;		/* 不做强制类型转换会报错 */

  

说明:

1)p是一个二级指针,它首先是一个指针,指向一个int*;
2)a是二维数组名,它首先是一个指针,指向一个含有4个元素的int数组;

由此可见,a和p的类型并不相同,如果想将a赋值给p,需要强制类型转换。

3. 为什么不能将二维数组名传递给二级指针?
假如我们将a赋值给p,p = (int**)a; 既然p是二级指针,那么当然可以这么用:**p; 这样会出什么问题呢?

1)首先看一下p的值,p指向a[0][0],即p的值为a[0][0]的地址;

2)再看一下*p的值,p所指向的类型是int*,占4字节,根据前面所讲的解引用操作符的过程:从p指向的地址开始,取连续4个字节的内容。得到的正式a[0][0]的值,即0。

3)再看一下**p的值,诶,报错了?当然报错了,因为你访问了地址为0的空间,而这个空间你是没有权限访问的。

实际上这是某一年华为的面试题。感兴趣的还可以把a的类型定义为char类型的二维数组,看看会发生什么。

4. 二维数组和二级指针相关的参数匹配

5. 那么问题来了,下题答案是?

C/C++二维数组名和二级指针的更多相关文章

  1. C++二维数组名的再探索

    #include <iostream> int main() { ][] = { , , , , , , , , , , , }; //输出 0,1,2,3,4,5,6,7,8,9,10, ...

  2. C++ 指针与二维数组名

    和一维数组类似,C++ 将二维数组名解释为其第一个元素的地址,而二维数组的第一个元素为一维数组,以下面的程序为例,二维数组名 array2d 和 &array2d[0] 等效,它们的类型都为 ...

  3. int (*p)[4] p 是二级指针 二维数组 二级指针 .xml

    pre{ line-height:1; color:#2f88e4; background-color:#e9ffff; font-size:16px;}.sysFunc{color:#3d7477; ...

  4. c语言中如何通过二级指针来操作二维数组

    通过二级指针去访问二维数组需要先给二级指针分配等同于二维数组行数的一维数组指针,然后把二维数组的每行首地址赋值给对应位置的一维指针上.之后就可以通过二维指针直接访问了. 参考代码如下,可以看具体注释辅 ...

  5. C/C++——二维数组与指针、指针数组、数组指针(行指针)、二级指针的用法

    本文转载自:https://blog.csdn.net/qq_33573235/article/details/79530792 1. 二维数组和指针 要用指针处理二维数组,首先要解决从存储的角度对二 ...

  6. C语言指针系列 - 一级指针.一维数组,二级指针,二维数组,指针数组,数组指针,函数指针,指针函数

    1. 数组名 C语言中的数组名是一个特殊的存在, 从本质上来讲, 数组名是一个地址, 我们可以打印一个指针的值,和打印一个数组的值来观察出这个本质: int nArray[10] ={ 0 }; in ...

  7. 深入理解C/C++二维数组

    深入理解C/C++二维数组 前言 本来以为自己对二维数组的理解还可以,没感觉有什么,但是今天小伙伴问了一个问题感觉迷惑了好久,于是决定细致的记录一下,一步一步的探究各种关于二维数组的问题,巩固基础. ...

  8. C语言教学--二维数组和指针的理解

    对于初学者对二维数组和指针的理解很模糊, 或者感觉很难理解, 其实我们和生活联系起来, 这一切都会变得清晰透彻. 我们用理解一维数组的思想来理解二维数组, 对于一维数组,每个箱子里存放的是具体的苹果, ...

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

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

随机推荐

  1. Tengine + Lua + GraphicsMagick 实现图片自动裁剪/缩放

    http://my.oschina.net/eduosi/blog/169606

  2. HTML与CSS中的定位个人分享

    定位 static - 默认值 (几乎不用,了解就可以) absolute - 绝对定位,不为元素预留空间,脱离文档流: 如果当前元素的父级元素是<body>元素的话 -> 是相对于 ...

  3. App开发工具

    软件下载: 链接:https://pan.baidu.com/s/1yaAko1svHW3v3kdn6mSgxQ提取码:rrcd 参考文档地址: http://dev.dcloud.net.cn/mu ...

  4. 使用VisualStudio 开发Arduino

    Arduino IDE界面简洁,整体功能还算完善,相比其他编译器明显的不足就是不能进行硬件调试,再就是没有代码提示功能,文件关系不清晰.头文件打开不方便. VisualStudio作为时下最为流行的W ...

  5. 千呼万唤始出来——DataV私有部署功能

    DataV的开发者们,今天进入你的用户中心,就会发现有一个小惊喜默默的在等待着你.那就是——私有部署功能上线啦! 一直以来私有部署都是一些有需要的小伙伴所望尘莫及的,毕竟高贵的身份摆在那里,现在不用再 ...

  6. JS onclick中this用法

    当在dom元素中使用onclick绑定事件的时候,可以使用this来指向该元素对象. 打印输出的内容为: 所以可以通过该this对象来获取子元素 //通过element获取该对象下的一个audio标签 ...

  7. 【PowerOJ1754&网络流24题】负载平衡问题(费用流)

    题意: 思路: [问题分析] 转化为供求平衡问题,用最小费用最大流解决. [建模方法] 首先求出所有仓库存货量平均值,设第i个仓库的盈余量为A[i],A[i] = 第i个仓库原有存货量 - 平均存货量 ...

  8. Internet History, Technology, and Security(week4)——History: Commercialization and Growth

    Explosive Growth of the Internet and Web: The Year of the Web 1994年后,由NCSA的老员工们构成的Netscape(网景)的成立.Ne ...

  9. [BZOJ4558]:[JLoi2016]方(容斥+模拟)

    题目传送门 题目描述 上帝说,不要圆,要方,于是便有了这道题.由于我们应该方,而且最好能够尽量方,所以上帝派我们来找正方形上帝把我们派到了一个有N行M列的方格图上,图上一共有$(N+1)\times ...

  10. MySQL慢日志分析之pt-query-digest

    http://www.php.cn/mysql-tutorials-357655.html 监控慢日志: pt-query-digest 切割分析慢日志 anemometer 删掉垃圾查询 pt-ki ...