C/C++二维数组名和二级指针
2017-07-13 13:15
218 查看
http://blog.csdn.net/wu_nan_nan/article/details/51741030
1.2 解引用操作符(dereference operator)会根据指针当前的地址值,以及所指向的数据类型,访问一块连续的内存空间(大小由指针所指向的数据类型决定),将这块空间的内容转换成相应的数据类型,并返回左值。
有时候,两个指针的值相同,但数据类型不同,解引用取到的值也是不同的,例如,
[cpp] view
plain copy
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返回。
通常我们认为数组名是一个指针常量(例如,int a[10]; 那么a是一个int * const),这种理解是不全面的,正确的理解如下:
作为右值(例如,赋值语句右边)时数组名可视为指针常量(系统自动转换);作为左值,例如取地址,sizeof,则不能视为指针。
sizeof(一个数组)返回的是数组大小*每个元素占字节数;而sizeof(一个指针)返回4。
2.2 二维数组
实际上,不管是一维还是多维数组,都是内存中一块线性连续空间,因此在内存级别上,其实都只是一维。
![](http://c.biancheng.net/cpp/uploads/allimg/120205/1-120205202345527.jpg)
![](https://img-blog.csdn.net/20160623112221221?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
(图片在参考资料2基础上稍作更改)
做如下定义:
[cpp] view
plain copy
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,需要强制类型转换。
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类型的二维数组,看看会发生什么。
![](https://img-blog.csdn.net/20160623113621428?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
(来源参考资料3)
![](https://img-blog.csdn.net/20160623151958674?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
参考资料:
1. http://blog.sina.com.cn/s/blog_5c6f793801019t3t.html
2. http://c.biancheng href="http://lib.csdn.net/base/dotnet" target=_blank>.NET/cpp/html/477.html
3. http://www.360doc.com/content/12/0421/23/8302596_205542017.
-----------------------------------------------------------------------------
1. 指针
1.1 一个指针包含两方面:a) 地址值;b) 所指向的数据类型。1.2 解引用操作符(dereference operator)会根据指针当前的地址值,以及所指向的数据类型,访问一块连续的内存空间(大小由指针所指向的数据类型决定),将这块空间的内容转换成相应的数据类型,并返回左值。
有时候,两个指针的值相同,但数据类型不同,解引用取到的值也是不同的,例如,
[cpp] view
plain copy
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 二维数组
实际上,不管是一维还是多维数组,都是内存中一块线性连续空间,因此在内存级别上,其实都只是一维。
![](http://c.biancheng.net/cpp/uploads/allimg/120205/1-120205202345527.jpg)
(图片在参考资料2基础上稍作更改)
做如下定义:
[cpp] view
plain copy
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. 二维数组和二级指针相关的参数匹配
(来源参考资料3)
5. 那么问题来了,下题答案是?
参考资料:
1. http://blog.sina.com.cn/s/blog_5c6f793801019t3t.html
2. http://c.biancheng href="http://lib.csdn.net/base/dotnet" target=_blank>.NET/cpp/html/477.html
3. http://www.360doc.com/content/12/0421/23/8302596_205542017.
-----------------------------------------------------------------------------
相关文章推荐
- C/C++二维数组名和二级指针
- C++:二维数组和二级指针的传递问题
- C++ 二级指针和二维数组
- C++指针和数组:二级指针和二维数组
- C/C++二维数组名和二级指针的联系与区别
- C/C++学习之C提高-----非空格的字符串长度、去掉字符串前后空格、字符串反转、键值对字符串、const练习、二级指针做输入/输出的特性、将字符串按逗号分开,并放入二维数组打印出来
- 二级指针与二维数组使用误区
- 二级指针和二维数组的转换
- 等级考试二级C++考点分析之数组、指针与引用
- C/C++中二级指针的理解
- 二维数组和二级指针的传递问题
- 二维数组与二级指针
- C++ 行指针访问(遍历)二维数组所有元素 .
- [转]二维数组和二级指针的传递问题
- 二级指针与二维数组的秘密【二者不等】
- 二维数组名就是二级指针,但是又不能像下面这样操作
- 二维数组传递给二级指针
- 二维数组名就是二级指针,但是又不能像下面这样操作
- 【C++】 动态二维数组 new 指向指针的指针
- 二维数组和二级指针