数组指针
#include <stdio.h>
int main()
{
int array[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int i;
int j;
int (*p)[4];//定义一个指针,指向一个数组,让指针偏移的时候,偏移对应数组的大小
p = array; //数组指针等同于二维数组名
for(i=0;i<3;i++){
for(j=0;j<4;j++){
printf("%d ",*(*(p+i)+j));
//printf("%d ",*(*(array+i)+j));
//printf("%d ",array[i][j]);
//printf("%d ",*(array[i]+j));
}
putchar('\n');
}
return 0;
}
结果
1 2 3 4
5 6 7 8
9 10 11 12
与二维数组运用
#include <stdio.h>
void hintInputData(int *phang,int *plie)
{
printf("请输入行列值:\n");
scanf("%d%d",phang,plie);
}
int getData(int (*p)[4],int hang,int lie)//标准的写法为'int (*)[4]',不能写成int *(p)[4]
{
int data;
data = *(*(p+hang)+lie);
//return array[hang][lie]
return data;
}
int main()
{
int array[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int hang,lie;
int data;
hintInputData(&hang,&lie);
data=getData(array,hang,lie);
printf("第%d行%d列的值为:%d\n",hang,lie,data);
return 0;
}
结果
请输入行列值:
2 3
第2行3列的值为:12
指针数组
什么是指针数组
一个数组,若其元素均为指针类型数据,称为指针数组,也就是说,指针数组中的每一个元素都存放一个地址,相当于一个指针变量。下面定义一个指针数组:
int * p[4];
由于[ ]比* 优先级高,因此p先与[4]结合,形成p[4]形式,这显然是数组形式,表示p数组有4个元素。然后再与p前面的* 结合,* 表示此数组是指针类型的,每个数组元素(相当于一个指针变量)都可指向一个整型变量。
注意不要写成
int (* p)[4];//这是指向一维数组的指针变量
#include <stdio.h>
int main()
{
int a = 10;
int b = 20;
int c = 30;
int d = 40;
int i;
int *p[4]={&a,&b,&c,&d};//定义指针数组,存放abcd的地址
for(i=0;i<4;i++){
printf("%d ",*(p[i]));
}
return 0;
}
结果
10 20 30 40
函数指针数组
#include <stdio.h>
int getMax(int data1,int data2)
{
return data1>data2?data1:data2;
}
int getMin(int data1,int data2)
{
return data1<data2?data1:data2;
}
int addData(int data1,int data2)
{
return data1+data2;
}
int main()
{
int a=10;
int b=20;
int ret;
int i;
int (*pfunc[3])(int ,int )={getMax,getMin,addData};//函数指针数组
for(i=0;i<3;i++){
ret=(*pfunc[i])(a,b);
printf("ret = %d\n",ret);
}
return 0;
}
结果
ret = 20
ret = 10
ret = 30