一、定义
指针数组:存放指针的数组,即数组里面的每个元素都是一个指针。语法定义:int *p1[10](由于[]的优先级高于*的优先级,所以先结合为数组,然后再结合为一个指针)如图一所示。
数组指针:一个指向数组的指针。语法定义:int (*p2)[10](由于()的优先级高于[]的优先级,所以先结合为指针,然后再结合为一个数组)如图一所示。
综上,可以简记为什么在后面,它就是什么类型。
图一 指针数组与数组指针
二、使用
2.1数组指针的运算
由于指针指向的是一个地址,因此数组指针也同样可以进行相关运算;例如指针的加减可以实现指针指向数组上一个或者下一个元素的功能。如图二所示。
图二 数组指针的加法运算
2.2 指针数组的运算和赋值
如图三所示,通过观察内存情况可知,指针数组+1时,只跳过一个元素的大小。
图三 指针数组的运算
2.3 数组指针的遍历
如图四、五所示,为数组指针的遍历。
#include <stdio.h>
int main(int argc, char *argv[])
{
int a[]={1,2,3,4,5};
int (*p)[5];
p=&a;
printf("%d",*(*p+3));
return 0;
}
#include <stdio.h>
int main(int argc, char *argv[])
{
// 二维数组与指针的结合使用
int a[2][5] = {{1,2,3,4,5},{6,7,8,9,10}};
int (*p1)[5]; // 数组指针
p1 = a; // 等同 p1 = &a[0]; // 指向二维数组的数组名
printf("a[0][2] = %d.\n", *(*(p1+0)+2)); // a[0][2] = 3
printf("a[1][2] = %d.\n", *(*(p1+1)+2)); // a[1][2] = 8
return 0;
}
图四 数组指针的遍历
2.4 指针数组遍历
#include <stdio.h>
int main(int argc, char *argv[])
{
int a;
char *ptr[] = {"I","am","a","boy"};
for (int i = 0; i < sizeof(ptr)/4; i++){
printf("%s\n",*(ptr+i)); //or ptr[i]
}
return 0;
}
图五 指针数组遍历
关于二维数组的相关符号。需要注意的是a[0]和*(a+0)等价,a[1]和*(a+1)等价,a[i]和*(a+i)等价。具体解释如表六所示。
表示形式 | 含义 |
a | 二维数组名 |
a[0],*(a+0),*a | 0行0列元素地址 |
a+1,&a[1] | 1行首地址 |
a[1],*(a+1) | 1行0列元素a[1][0]的地址 |
a[1]+2,*(a+1)+2,&a[1][2] | 1行2列元素a[1][2]的地址 |
*(a[1]+2),*(*(a+1)+2),a[1][2] | 1行2列元素a[1][2]的值 |
三、应用
指针数组在实际工程中,有着非常经典的、令人拍案的应用!!
未完,待续.....
3.1 函数指针数组的使用
下面例子演示了函数指针数组的声明和使用。程序中定义2个函数:func1、func2,且每个函数带一个整形参数,无返回值。
#include <stdio.h>
void function_1(int num) {
printf("This is function_1,it's number is %d\n",num);
}
void function_2(int num) {
printf("This is function_2,it's number is %d\n",num);
}
int main(int argc, char *argv[])
{
int a;
void (*ptr[])(int)={function_1,function_2};
printf("please input a number code:");
scanf("%d",&a);
do{
ptr[a](a);
printf("Choice Number: \n");
scanf("%d",&a);
}while(a>=0 && a <= 1);
return 0;
}
3.2 函数指针作为函数参数
该例子中每次给process函数不同实参(函数名),即可实现不同功能,而函数本身不必做任何修改。
#include <stdio.h>
int add(int a,int b)
{
int sum =a+b;
return sum;
}
int sub(int a,int b)
{
int sub =a-b;
return sub;
}
int muti(int a,int b)
{
int muti=a/b;
return muti;
}
int process(int a,int b,int (*fun)(int,int))
{
int result = fun(a,b);
return result;
}
int main(int argc, char* argv[])
{
int result=0;
result = process(8,4,muti);
printf("%d \n",result);
return 0;
}