A部分 指针在一维数组 整型指针 int *p ----[ 3 ]----E部分指针数组
B部分 指针在二维数组-----------XXXXXXX 数组指针(父数组) int ( *parr) [ 3 ];
C部分 指针在函数 -----------G部分函数指针数组 函数指针 int ( *Pfunc) (int, int );
A部分
指针的初始化 (避免野指针) int a =10; int *p =&a; 指针的解引用操作(找到对应的整型数据,找到对应的二维数组,调用对应的函数) 指针版 printf("a的数值是%d,a的内存地址ID是%p", *p, p); 原版 printf("a的数值是%d,a的内存地址ID是%p", a, &a);
B部分
数组指针 parr是个指针,控制权限大小是4
arr[ ][ 4 ] ={ {4,6,7,9 } , { 2,47,60,7 } , {66,90,5,30 } }; int ( *parr)[ 4 ] =arr; 指针版 printf(" 二维数组中第i行第j列的数据是%d,该数据的地址是%p, *( *(arr+i-1) + j ) , *(arr+i-1) + j "); 原版 printf(" 二维数组中第i行第j列的数据是%d,该数据的地址是%p, arr[ i-1 ][j-1 ] , & arr[ i-1 ][j-1 ] ) ;
C部分
1.函数的功能优先思想 直接使用函数的功能性,随后再考虑函数如何实现,即先根据需求调用函数,在想办法把函数实现。 2.函数传参的思想 a.传递数值。即已经在main中开辟空间,并赋值了,只是涉及在函数1中表层数据的处理,不会改变main中的内存数据。 int a =10 ; int b =20 ; int Add(int ,int ) ret = Add(a,b) main中开辟的A空间已赋值,传递的是数值。不会涉及到修改A的内存数据。 b.传递地址。只在main函数中开辟了空间,A空间中并未赋值,调用函数1(传递给他mainA对应地址)实现对main中开辟的空间的赋值;当传递是数组名时,直接对数组赋值,遍历,改值等操作。直接修改main中对应的空间内存数据 3.调用函数二种方法 直接法, 函数名调用 间接法,函数指针去调用
4.回调函数的思想。 int( *Pfunc)(int ,int); $ 定义函数指针变量 int cmd; scanf("%d",&cmd); switch(cmd){
case 1: Pfunc =GetMax; $$$$ 初始化 指针 break; case 2:Pfunc = GetMin; break;
}
int DataHandler( int data1,int data2 , int (*Pfunc)( int,int ) )
{ 用函数指针,调用函数
return (*Pfunc) (data1,data1)
}
函数指针 int ( *Pfunc)( int ,int data2 ) *(Pfunc)(20, 30 )
E部分
指针数组 int *p[ 3 ] p是个数组,每个数组元素是地址类型。
int a=10; int b=15; int c =20; int *p[ 3 ] ={ &a,&b,&c }; primtf( "数据的地址是 %p,该地址下对应的数据是 %d " , p , *p ) ;
F部分 函数指针数组 int ( *Pfunc[ 3 ] ) ( int,int )={
GetMax,Getmin,GetMul}; 注意与回调函数区别(函数指针) for(int i =0;i<3;i++){
*Pfunc[ i ](39,20)
}
最后优先级
p先与小括号 再与中括号 最后与解引用的优先顺序。