一:数组指针 int (*p)[4]
1.定义一个指针,让指针偏移的时候,也偏移对应大小的数组。
2.定义一个指针,指向一个数组。
3.数组指针才是真正等同于二维数组名。
#include<stdio.h>
int main()
{
int arr[3][4]={{11,22,33,44},{12,13,14,15},{22,77,88,99}};
int i,j;
int (*p)[4];
p=arr;
for(i=0;i<3;i++)
for(j=0;j<4;j++)
printf("%d\n",*(*(p+i)+j));
return 0;
}
4.数组指针与二维数组结合取某行某列元素
#include<stdio.h>
void tipsInputHangLie(int *pm,int *pn)
{
printf("请输入行列值:\n");
scanf("%d%d",pm,pn);
}
int getTheData(int (*p)[4],int hang,int lie)
{
int data;
data = *(*(p+hang)+lie);
return data;
}
int main()
{
int arr[3][4]={{11,22,33,44},{12,13,14,15},{22,77,88,99}};
int ihang,ilie;
int data;
tipsInputHangLie(&ihang,&ilie);
data = getTheData(arr,ihang,ilie);
printf("%d行%d列的值为%d\n",ihang,ilie,data);
return 0;
}
二:函数指针 int (*p)(int a,int b)
1.函数名就是地址 = 数组名就是地址。
2.定义一个函数指针变量,和普通变量一样:
int getData(int a,int b)
int (*p)(int a,int b)
3.函数调用:直接访问,变量名(函数名);间接访问,指针(函数指针)
#include<stdio.h>
void printWelcome()
{
printf("Welcome!\n");
}
int main()
{
void (*p)(); //定义
p=printWelcome; //指向
(*p)(); //调用
printWelcome();
return 0;
}
//函数指针返回最大值最小值和
//回调函数
#include<stdio.h>
int getMax(int data1,int data2)
{
int Max;
Max = data1>data2?data1:data2;
return Max;
}
int getMin(int data1,int data2)
{
int Min;
Min = data1<data2?data1:data2;
return Min;
}
int getSum(int data1,int data2)
{
int Sum;
Sum = data1+data2;
return Sum;
}
int hand(int data1,int data2,int (*pfunc)(int data1,int data2))
{
int ret;
ret = (*pfunc)(data1,data2);
return ret;
}
int main()
{
int a=10;
int b=20;
int cmd;
int ret;
printf("请输入:\n");
scanf("%d",&cmd);
int (*pfunc)(int data1,int data2);
switch(cmd){
case 1:
pfunc=getMax;
break;
case 2:
pfunc=getMin;
break;
case 3:
pfunc=getSum;
break;
default:
printf("输入错误!");
break;
}
ret = hand(a,b,pfunc);
printf("%d",ret);
return 0;
}
三:指针数组 int *p[4]
1.一个数组,其元素均为指针类型数据,里面每一个都是一个指针
2.是数组,数组的每一项都是一个指针变量
3.函数指针数组 int (*p[4])(int ,int )
int (*pfunc[3])(int data1,int data2)={
getMax,
getMin,
getSum
}; //赋值,否则是野指针
for(int i=0;i<3;i++)
{
ret = (*pfunc[i])(a,b);
printf("ret = %d\n",ret);
}
四:指针函数 int * a(int x,int y)
1.返回的值是指针类型
#include<stdio.h>
int* getPosPerson(int pos,int (*pstu)[4])
{
int *p;
p = (int *)pstu+pos;
return p;
}
int main()
{
int scores[3][4]={
{1,2,3,4},
{5,6,7,8},
{9,10,11,12}
};
int pos;
printf("请输入号数:\n");
scanf("%d",&pos);
int *ppos;
ppos = getPosPerson(pos,scores);
for(int i = 0;i<4;i++)
printf("%d ",*ppos++);
return 0;
}