指向二维数组的指针
来源:互联网 发布:js设定div高度 编辑:程序博客网 时间:2024/05/21 09:30
在C++ Primer第四章遇到了二维数组和指针的内容,理解起来有点绕,这里做个小节。
在C++ Primer中介绍了一种访问二位数组的方式,定义一个指向一位数组的指针,通过这个指针访问二维数组:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using
namespace
std;
int
main()
{
int
twoArray[3][4] = {{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}};
int
(*p)[4] = twoArray;
// 定义一个指向一维数组的指针
cout <<
"size of p is: "
<<
sizeof
(p) << endl;
// p占用4个字节,说明其是一个指针
for
(p = twoArray; p != twoArray + 3; ++p) {
// 第一层循环,每个循环遍历一行元素
for
(
int
*q = *p; q != *p + 4; ++q) {
// 第二层循环,每次循环输出一个元素
cout << *q <<
" "
;
}
cout << endl;
}
return
0;
}
这里需要有几个地方值得注意:
(1)(*p)[4] 和 *p[4]的区别
(*p)[4]是定义一个指向一维数组的指针,这个一维数组有4个元素;而*p[4]是定义了一个包含四个指针元素的指针数组。用sizeof()计算两个p,发现第一个p的大小是4,也即它是一个指针,第二个p的大小是16,因为它是一个包含4个指针的数组。
(2)上面程序的循环里*p代表的含义是什么
要弄清这个问题,我们先要看看二维数组的表示方法:
上图表示了二维数组的存储方法,twoArray[0]~twoArray[2]表示各一维数组的首地址,二维数组名twoArray表示整个二维数组的首地址,它和twoArray[0]以及twoArray[0][0]是同一个地址。但是他们表示的级别是不同的,因此不能混用。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int
main()
{
int
twoArray[3][4] = {{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}};
int
(*p)[4] = twoArray;
// 定义一个指向一维数组的指针
p++;
cout << twoArray[1] << endl;
//比较twoArray[1]和&twoArray[1]的区别
cout << &twoArray[1] << endl;
if
(p == &twoArray[1]) {
// 必须是 &twoArray[1]
cout <<
"true"
<< endl;
}
else
{
cout <<
"false"
<< endl;
}
return
0;
}
1
twoArray[1]和&twoArray[1]输出的内容是相同的,都是第1行的首地址,但是他们的含义是不同的,twoArray[1]
是元素级别的,是int*,而&twoArray[1]是行级别的,是int(*p)4。也就是说,如果对twoArray[1]加1,那么指针移动到下一个元素的位置,而如果对&twoArray[1]加1,指针移动到下一行的位置:
1
2
3
cout << **(&twoArray[1] + 1) << endl;
cout << *(twoArray[1] + 1) << endl;
<SPAN style=
"FONT-FAMILY: Verdana"
face=
"Verdana"
> 上面代码的结果是第一行输出8而第二行输出5,且因为&twoArray[1]行级别的,因此需要两次解引用才能取得实际元素的值。</SPAN>
1
<SPAN style=
"FONT-FAMILY: Verdana"
face=
"Verdana"
> p就是针对行级别的指针,它和&twoArray[1]在同一级别,因此上面代码在判断的时候,如果用</SPAN>
1
if
(p == twoArray[1])
则会报错:int (*)[4]与int [4]的间接寻址级别不同。
因此,对p的解引用操作*p将得到元素级别的指针,第一段程序中q就是这样的指针。
- 指向二维数组的指针
- 指向二维数组的指针
- 指向二维数组的指针
- 指向二维数组的指针
- 指向二维数组的指针
- 指向二维数组的指针
- 指向二维数组的指针
- 指向二维数组的指针
- 指向二维数组的指针
- 二维数组 指向二维数组的指针 指针数组 指向二维数组的指针数组
- 二维数组和指向指针的指针
- 二维数组和指向指针的指针
- 二维数组和指向指针的指针
- 二维数组和指向指针的指针
- 二维数组和指向指针的指针
- 二维数组与指向指针的指针
- 二维数组和指向指针的指针
- 二维数组和指向指针的指针
- iOS: 第一个iphone app
- ASCII码对照表||ios_base::binary | ios_base::in
- JSP文件下载
- 文件权限说明
- php中数组传值问题
- 指向二维数组的指针
- 第三周实验报告
- C语言和设计模式(解释器模式)【文章都是来自网络,只要自己吸取了就是自己的】 .
- RHEL5.5 下ddd-3.3.12的安装
- 增量式PID控制C语言代码
- linux下RTP编程(使用JRTPLIB)
- C语言和设计模式(命令模式)【文章都是来自网络,只要自己吸取了就是自己的】
- 第三周实验报告
- C语言和设计模式(状态模式) 【文章都是来自网络,只要自己吸取了就是自己的】