写在前面
- 指针数组 *p[n]:是数组,装着指针的数组
- 数组指针 (*P)[n]:指向数组的指针,是指针
- 一般用数组首元素的地址标识一个数组
指针数组
首先看一下指针
- 可以将指针比作名片,将变量比作一个东西,名片上印上了这个东西的地址。
- 知道了一个变量对应的指针,就相当于知道了这个东西在的地方,
- 那么我们就可以拿着这个名片(指针)找到这个东西(变量),然后去对这个东西进行修改(修改变量)
- 这个东西可以是一个变量,也可以是一个数组,函数或者结构
指针数组
分析
根据优先级来判断:优先级:()>[]>*
数组指针 *P[n]:P[n]表明首先是数组,主体是数组,加上‘ * ’,表明数组里存放着指针。即装着指针的数组
举例
/**
* 指针数组辨析
*/
void Pointer_Array()
{
int a=1;
int b=2;
int *Pointer[2]; //数组,可以存放两个指针
Pointer[0] = &a;
Pointer[1] = &b;
printf("&a: %p\n",&a); //a的地址
printf("Pointer[0]: %p\n",Pointer[1]); //a的地址
printf("&b: %p\n",&b); //b的地址
printf("Pointer[1]: %p\n",Pointer[1]); //b的地址
printf("*Pointer[0]: %d\n",*Pointer[0]); //Pointer[1]是a的地址,*Pointer[0]就是a的值
printf("*Pointer[1]: %d\n",*Pointer[1]); //b的值
}
调用结果:
数组指针
分析
数组指针 (*P)[n]:同样根据优先级来判断。()优先级最高,( * p)表明主体是指针,加上[n],表明这个指针可以指向数组(一般指向首地址),即数组的指针
举例
void Array_Pointer()
{
int Array[]={1,2,3,4,5};
int (*Pointer)[5]; //指针,需要指向含有5个元素的数组
Pointer = &Array;
//将数组Array的首地址付给Pointer
//%p输出地址,%d输出十进制整数
printf("&Array %p\n",&Array);
printf("Pointer %p\n",Pointer); //Pointer等价于&Array
printf("Array %p\n",Array); //数组名就是数组首元素的地址
printf("*Pointer %p\n",*Pointer); //*Pointer等价于Array,表示这个数组
printf("&Array[0]: %p\n",&Array[0]); //数组首元素的地址
printf("&Array[1]: %p\n",&Array[1]); //数组第二个元素的地址
printf("Pointer[0]: %p\n",Pointer[0]); //数组首元素的地址
printf("Pointer[1]: %p\n",Pointer[1]); //数组第二个元素的地址
printf("**Pointer: %d\n",**Pointer); //*Pointer就是数组Array,即数组组首元素的地址,*(*Pointer)就是取该地址下对应的值,即数组首元素
printf("*Pointer[0]:%d\n",*Pointer[0]); //数组首元素
printf("*Pointer[1]:%d\n",*Pointer[1]); //一个没有绑定区域的野指针
}
结果:
总结
- 指针数组 *p[n]:是数组,装着指针的数组
- 数组指针 (*P)[n]:是指针,这个指针可以指向数组