函数指针数组
int Add(int x,int y)
{
return x+y;
}
int Sub(int x,int y)
{
return x-y;
}int Mul(int x,int y)
{
return x*y;
}int Div(int x,int y)
{
return x/y;
}
int main()
{
int (*pa)(int,int)=Add;//此时除了存放Add函数,我们还想存放Sub,Mul,Div函数,怎么办呢,建立函数指针数组
int (*parr[4])(int,int)={Add,Sub,Mul,Div}//建立函数指针的数组
//int* arr[5];注意区分指针数组和函数指针数组
int i=0;
for(i =0;i<4;i++)//循环调用
{
printf("%d\n",parr[i](2,3));
}
}
指向函数指针数组的指针
int main()
{
int (*pa)(int,int)=Add;//此时除了存放Add函数,我们还想存放Sub,Mul,Div函数,怎么办呢,建立函数指针数组
//int (*parr)(int,int)函数指针
int (*parr[4])(int,int)={Add,Sub,Mul,Div}//建立函数指针的数组
int (*(*parrs)[4])(int,int)=&parr//建立指向函数指针数组的指针
//parrs是一个数组指针,指针指向的数组有4个元素,每个元素的类型是一个函数指针int(*)(int,int)
]
回调函数
通过函数指针调用的函数
void print(char *str)//print叫回调函数,通过test函数调用的print
{
printf("hh\n");
}
void test(char *str)
{
printf("test\n");
p("biteaa")
}
int main()
{
test(print);//通过函数调用另一个函数,输出hhbiteaa
return 0;
}
总结篇
再次提醒:
数组名是首元素地址,除下面两个
👉size of(数组名)-表示整个数组
👉&数组名-表示整个数组
一维数组
int a[]={1,2,3,4};
printf("%d\n",size(a));//16计算的是数组空间总大小。单位是字节
printf("%d\n",size(a+0));//4/8 32位平台4个字节,64位平台8字节,此时的a不是单独在size of下,所以表示首元素地址
printf("%d\n",size(*a));//4.数组名表示首元素地址,*a就是首元素,整型的大小就是4
printf("%d\n",size(a+1));//4/8,a+1表示第二个元素地址
printf("%d\n",size(a[1]));//4第二个元素的大小
printf("%d\n",size(&a));//4/8取出的数组的地址,取出数组的大小4/8
printf("%d\n",size(*&a));//16,&a就是数组的地址,数组地址解引用访问的地址就是数组的的大小,相当于*和&互相抵消
printf("%d\n",size(&a+1));//4/8,虽然他跳过整个数组的地址,还是地址的大小
printf("%d\n",size(&a[0]));//4/8,第一个元素的地址
printf("%d\n",size(&a[0]+1));//4/8是第二个元素的地址
求字符数组空间大小
char arr[]={'a','b','c','d','e','f'};
printf("%d",sizeof(arr));//6 数组大小,6*1=6
printf("%d",sizeof(arr+0));//4/8,32位平台4个字节,64位平台8字节,此时的a不是单独在size of下,所以表示首元素地址
printf("%d",sizeof(*arr));//1,arr是首元素的地址,*arr就是首元素,首元素是字符大小的一个字节
printf("%d",sizeof(arr[1]));//1
printf("%d",sizeof(&arr));//4/8 数组的地址,地址的大小永远是4/8
printf("%d",sizeof($arr+1));//4/8虽然他跳过整个数组的地址,还是地址的大小
printf("%d",sizeof(&arr[0]+1));//4/8是第二个元素的地址
求字符数组不同情况下长度
char arr[]={'a','b','c','d','e','f'};
printf("%d",strlen(arr));//随机值,虽然目前为6,但strlen函数必须找到/0才结束
printf("%d",strlen(arr+0));//随机值,和上面写法相同
printf("%d",strlen(*arr));//报错,a的码是97,此时传过去,程序会从97向后访问,非法访问
printf("%d",strlen(arr[1]));//报错,b的码是98,此时传过去,程序会从98向后访问,非法访问
printf("%d",strlen(&arr));//随机值,虽然目前为6,但strlen函数必须找到/0才结束
printf("%d",strlen(&arr+1));//随机值,但与上面最随机值起码差6
printf("%d",strlen(&arr[0]+1));//随机值,但与最上面随机值起码差1
求字符串不同空间大小
char arr[]={"abcdef"};
printf("%d",sizeof(arr));//7 计算整个数组空间的大小,和/0无关
printf("%d",sizeof(arr+0));//4/8,32位平台4个字节,64位平台8字节,此时的a不是单独在size of下,所以arr+0表示首元素地址
printf("%d",sizeof(*arr));//1,arr是首元素的地址,*arr就是首元素,首元素是字符大小的一个字
printf("%d",sizeof(arr[1]));//1 第二个元素的大小
printf("%d",sizeof(&arr));//4/8,数组的地址
printf("%d",sizeof(&arr+1));//4/8虽然他跳过整个数组的地址,还是地址的大小
printf("%d",sizeof(&arr[0]+1));//4/8是第二个元素的地址,还是地址的大小
求字符串不同情况长度
char arr[]={"abcdef"};//abcdef\0
printf("%d",strlen(arr));//6,当碰上\0时,停止计算
printf("%d",strlen(arr+0));//6,首元素地址加0还是首元素地址
printf("%d",strlen(*arr));//报错,a的码是97,此时传过去,程序会从97向后访问空间,非法访问
printf("%d",strlen(arr[1]));//报错,b的码是98,此时传过去,程序会从98向后访问空间,非法访问
printf("%d",strlen(&arr));//6,会产生警告数组地址,数组类型char(*)[7]
printf("%d",strlen(&arr+1));//随机值,跳过整个数组,不知道何时有/0
printf("%d",strlen(&arr[0]+1));//5,第二个字符向后数,碰到\0停止,所以是5
求指针变量不同情况的空间大小
char *p="abcdef";
printf("%d",sizeof(p));//4/8,计算指针变量首元素地址的空间大小
printf("%d",sizeof(p+1));//4/8,得到是字符b的地址
printf("%d",sizeof(*p));//1,字符串的第一个字符a的大小
printf("%d",sizeof(p[0]));//1,p[0]==*(p+0),和*p意义一样
printf("%d",sizeof(&p));//4/8,第一个元素地址
printf("%d",sizeof(&p+1));//4/8,跳过这个字符串的地址
printf("%d",sizeof(&p[0]+1));4/8,第二个字符地址
求指针变量不同情况的长度
char *p="abcdef";
printf("%d",strlen(p));//6
printf("%d",strlen(p+1));//5
printf("%d",strlen(*p));//报错
printf("%d",strlen(p[0]));//报错
printf("%d",strlen(&p));//随即值,另有一块空间,&p将从新空间向后数字符,
printf("%d",strlen(&p+1));//随即值,另有一块空间,&p将从新空间+1向后数字符,
printf("%d",strlen(&p[0]+1));//5
二维数组不同情况下空间大小
int a[3][4]={ 0 };
printf("%d\n",sizeof(a));//48,3*4*4字节
printf("%d\n",sizeof(a[0][0]));//4
printf("%d\n",sizeof(a[0]));//16
printf("%d\n",sizeof(a[0]+1));//4,a[0]没有单独放在sizeof后,也没有&符号,所以a[0]表示第一行的首元素地址
printf("%d\n",sizeof(*(a[0]+1)));//4,第一行第二个元素
printf("%d\n",sizeof(a+1));//a是二维数组的数组名,没有单独放在sizeof后,也没有&符号,所以a是二维数组的首元素是它的第一行,a+1是第二行数组地址
printf("%d\n",sizeof(*(a+1)));//16 第二行大小
printf("%d\n",sizeof(&a[0]+1));//4 第二行地址大小
printf("%d\n",sizeof(*(&a[0])+1));//16 第二行地址解引用就是第二行大小
printf("%d\n",sizeof(*a));//16a是首元素地址,就是第一行,*a就是第一行的大小
printf("%d\n",sizeof(a[3]));//16,sizeof不参与运算,只是根据类型判断大小
花神博客生涯之C语言(指针篇)结束了哦~
接下来会持续更新(⊙o⊙)!