您的位置:首页 > 编程语言 > C语言/C++

黑马程序员--C语言--01-指针数组、指向数组的指针、指向指针的指针

2014-12-15 20:43 253 查看

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

1、什么是指针数组和指向数组的指针

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

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

int* a[10]     指针数组,表示:数组a中的元素都为int型指针,元素表示:*a[i]   *(a[i])是一样的,因为[]优先级高于*;

int (*a)[10]   数组指针,表示:指向数组a的指针,元素表示:(*a)[i]。

int c[10]={1,2,3,4,5,6,7,8,9,10};
int *a[10]; //指针数组
int (*b)[10]; //数组指针
b=&c;


实际应用中,对于指针数组可以这样使用:

typedef int* pInt;
pInt a[10];

数组名相当于一个指针常量

2、指向指针的指针

一个指针变量内部可以存储一个值,这个值是另外一个对象的地址,所以一个指针变量可以指向一个普通变量,同样这个指针变量也有一个地址,也就是说可以有一个东西指向这个指针变量,然后再通过这个指针变量指向这个对象。这个指针就是指向指针的指针(二重指针):
int  *p1=&i;
int **p2=&p1;

下面看一下函数的形参可以接收那些实参类型,编译时不会报错
int a[3],b[2][3],c,*d[3];
void fun1(int *p);
void fun2(int (*p)[3]);
void fun3(int **p);
void fun4(int p[3]);
void fun5(int p[]);
void fun6(int p[2][3]);
void fun7(int (&p)[3]);


见下表

函数传入这些值编译器不会报错
fun1a, &a[i], *b ,b[i],&b[i][j] ,&c ,d[i]
fun2b,b+i
fun3d
fun4a, &a[i], *b ,b[i],&b[i][j] ,&c ,d[i]
fun5a, &a[i], *b ,b[i],&b[i][j] ,&c ,d[i]
fun6b
fun7a
分析如下:
1、对于fun1 fun4 fun5:在编译器看来fun1,fun4,fun5的声明是一样,在编译时候,编译器把数组的大小舍去不考虑,只考虑它是一个指针,也就是说有没有大小说明是一样的,所以三者的形式都是fun1的形式(其实只要提供了int*指针就可以了);
2、对于fun2:p是一个指向一个含有3个元素的数组,这样b和b+i正好合适,而a却不是(它是指向a[0]的,不是指向这个数组的);
3、对于fun3:p是一个指针的指针,而d指向d[0],同时d[0]又是一个指针,所以d就是一个指针的指针。但是b却不是(它是一个2*3的矩阵也就是年int
[2][3]类型); 
4、对于fun6:p是一个2*3的数组类型,和b恰好完全匹配; 
5、对于fun7:以上的解释对于引用是不适用的,如果变量被声明为数组的引用,那么编译器就要考虑数组的大小了,那么必须和声明一模一样(所以fun7就只有a合适);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: