我是靠谱客的博主 强健帽子,最近开发中收集的这篇文章主要介绍指针数组和数组指针的区别数组与指针的艺术--深入探索c/c++数组与指针的奥秘 ,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

参考:指针数组和数组指针的区别 关于C语言行指针的详细解析

 

指针数组:array of pointers,即用于存储指针的数组,也就是数组元素都是指针

数组指针:a pointer to an array,即指向数组的指针

还要注意的是他们用法的区别,下面举例说明。

int* a[4]     指针数组     

                 表示:数组a中的元素都为int型指针    

                 int型元素表示:*a[i] (a[i]表示int型元素的地址)  *(a[i])是一样的,因为[]优先级高于*

int (*a)[4]   数组指针                          ----------另一中理解方式:int (*)[4] a;

                 表示:指向int型数组a的指针

                 int型元素表示:(*a)[i]  

注意:在实际应用中,对于指针数组,我们经常这样使用:

1 #include "stdafx.h"
2
3 typedef int* pInt;
4 pInt a[4];
5
6 int _tmain(int argc, _TCHAR* argv[])
7 {
8
return 0;
9 }

这跟上面指针数组定义所表达的意思是一样的,只不过采取了类型变换。

 

数组指针代码如下:

 1 #include "stdafx.h"
 2
 3
 4 int _tmain(int argc, _TCHAR* argv[])
 5 {
 6
int array[3] = {1,2,3};
 7
 8
//指针数组:array of pointers,即用于存储指针的数组,也就是数组元素都是指针
 9
typedef int* pInt;
10
pInt pIntArray[3] = {&array[0], &array[1], &array[2]};
11
12
for(int i = 0; i < 3; ++i)
13
printf("%dn", array[i]);
14
15
printf("n");
16
17
for(int i = 0; i < 3; ++i)
18
printf("%p %dn", pIntArray[i], *pIntArray[i]);
19
20
printf("数组指针n");
21
22
//数组指针:a pointer to an array,即指向数组的指针
23
int (*arrayPointer)[3];
24
25
arrayPointer = &array; //arrayPointer = array;
26
//error C2440: '=' : cannot convert from 'int [3]' to 'int (*)[3]'
27
//arrayPointer类型是int (*)[3],array类型是int [3]
28
29
for(int i = 0;i < 3;++i)
30
printf("%dn", (*arrayPointer)[i]); //arrayPointer = &array; *arrayPointer即逆向引用等同于array
31
32
printf("通过二维数组理解数组指针n");
33
34
//通过二维数组理解数组指针
35
int array2D[2][3] = {{11,12,13},
36
{24,25,26} }; //定义的array2D[2][3]的二维数组,可以把它当2个一维数组来看待。即:
37
//array2D[0]={11,12,13}
38
//array2D[1]={24,25,26}
39
for(int i = 0;i < 2;++i)
40 
{
41
for(int j = 0;j < 3;++j)
42
printf("%d ", array2D[i][j]);
43
printf("n");
44 
}
45
46
printf("行指针即为数组指针n");
47
48
//行指针即为数组指针(行指针:指向一行的指针,即二维数组中的某一行)
49
int (*rowPointer)[3];
50
rowPointer = &array2D[0]; //rowPointer = array2D[0];(rowPointer = array2D √:array2D即为&array2D[0])
51
//error C2440: '=' : cannot convert from 'int [3]' to 'int (*)[3]'
52
//rowPointer类型是int (*)[3],array2D[0]类型是int [3]
53
54
printf("%p %pn", &array2D[0], &array2D[0][0]); //array2D[0]和array2D[0][0]地址相同却意义不同:
55
//array2D[0]类型是int [3], array2D[0][0]类型是 int
56
//计算机中的字节就是一堆010101.....
57
//用什么类型的变量解释这堆数据,
58
//得到的就是对应类型的数据(类型强转基于此)
59
printf("通过行指针取出元素方式一n");
60
61
for(int i = 0;i < 2;++i)
62 
{
63
for(int j = 0;j < 3;++j)
64
printf("%d ", (*(rowPointer + 1))[j]);
65
printf("n");
66 
}
67
68
printf("通过行指针取出元素方式二n");
69
70
for(int i = 0;i < 2;++i)
71 
{
72
for(int j = 0;j < 3;++j)
73
printf("%d ", (*(rowPointer))[j]);
74
rowPointer++; //行指针移动到下一行,移动n个地址位,n为一行的元素个数x元素的字节大小
75
printf("n");
76 
}
77
78 
getchar();
79
return 0;
80 }

 

结果:

 

 

数组与指针的艺术--深入探索c/c++数组与指针的奥秘 

转载于:https://www.cnblogs.com/kira2will/p/4099290.html

最后

以上就是强健帽子为你收集整理的指针数组和数组指针的区别数组与指针的艺术--深入探索c/c++数组与指针的奥秘 的全部内容,希望文章能够帮你解决指针数组和数组指针的区别数组与指针的艺术--深入探索c/c++数组与指针的奥秘 所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部