一、 指针指向字符常量 1 2 3 4 5 6 7 8 9 10 11 12 13 char *pc1 = "9TSe" ;char *pc2 = "9TSe" ;const char *pc1 = "9TSe" ;const char *pc2 = "9TSe" ;
二、 指针、数组
1. 指针数组
指针数组是一个数组 数组里面存放着指针
1 2 3 4 5 6 7 int a[3 ] = {1 ,2 ,3 };int b[3 ] = {4 ,5 ,6 };int c[3 ] = {7 ,8 ,9 };int * arr[3 ] = {a,b,c};
2. 数组指针
数组指针是一个指针 指向数组的指针
1 2 3 4 5 6 7 8 9 10 int arr[5 ] = {1 ,2 ,3 ,4 ,5 };int *parr = arr; int *parr = &arr; int *parr[5 ] = &arr; int (*parr)[5 ] = &arr;
1 2 3 double * (*pd)[5 ] = &arr;
3. 数组参数,指针参数传参
①一维数组传参 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 void test1 (int arr[]) void test1 (int arr[10 ]) void test1 (int *arr) void test2 (int *arr[20 ]) void test2 (int **arr) int main () { int arr1[10 ] = {0 }; int *arr2[20 ] = {0 }; test1(arr1); test2(arr2); }
②二维数组的传参 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 void test (int arr[3 ][5 ]) ; void test (int arr[][]) ; void test (int arr[][5 ]) ; void test (int *arr) ; void test (int *arr[5 ]) ; void test (int (*arr)[5 ]) ;void test (int **arr) ; int main () { int arr[3 ][5 ] = {0 }; test(arr); }
4. 一维数组,二维数组,指针大小判断例题
①整形数组 1 2 3 4 5 6 7 8 9 10 11 12 13 int a[] = {1 ,2 ,3 ,4 );printf ("%d\n" ,sizeof (a)); printf ("%d\n" ,sizeof (a+0 )); printf ("%d\n" ,sizeof (*a)); printf ("%d\n" ,sizeof (a+1 )); printf ("%d\n" ,sizeof (a[1 ]));printf ("%d\n" ,sizeof (&a)); printf ("%d\n" ,sizeof (*&a)); printf ("%d\n" ,sizeof (&a+1 )); printf ("%d\n" ,sizeof (&a[0 ])); printf ("%d\n" ,sizeof (&a[0 ]+1 ));
②字符数组 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 char arr[] = {'a' ,'b' ,'c' ,'d' ,'e' ,'f' };printf ("%d\n" ,sizeof (arr)); printf ("%d\n" ,sizeof (arr+0 )); printf ("%d\n" ,sizeof (*arr)); printf ("%d\n" ,sizeof (arr[1 ])); printf ("%d\n" ,sizeof (&arr)); printf ("%d\n" ,sizeof (&arr+1 )); printf ("%d\n" ,sizeof (&arr[0 ]+1 ));printf ("%d\n" ,strlen (arr)); printf ("%d\n" ,strlen (arr+0 )); printf ("%d\n" ,strlen (*arr)); printf ("%d\n" ,strlen (arr[1 ])); printf ("%d\n" ,strlen (&arr)); printf ("%d\n" ,strlen (&arr+1 )); printf ("%d\n" ,strlen (&arr[0 ]+1 ));
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 char arr[] = "abcdef" ; printf ("%d\n" ,sizeof (arr)); printf ("%d\n" ,sizeof (arr+0 )); printf ("%d\n" ,sizeof (*arr)); printf ("%d\n" ,sizeof (arr[1 ])); printf ("%d\n" ,sizeof (&arr)); printf ("%d\n" ,sizeof (&arr+1 )); printf ("%d\n" ,sizeof (&arr[0 ]+1 ));printf ("%d\n" ,strlen (arr)); printf ("%d\n" ,strlen (arr+0 )); printf ("%d\n" ,strlen (*arr)); printf ("%d\n" ,strlen (arr[1 ])); printf ("%d\n" ,strlen (&arr)); printf ("%d\n" ,strlen (&arr+1 )); printf ("%d\n" ,strlen (&arr[0 ]+1 ));
③指针指向字符串 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 char *p = "abcdef" ;printf ("%d\n" ,sizeof (p)); printf ("%d\n" ,sizeof (p+1 )); printf ("%d\n" ,sizeof (*p)); printf ("%d\n" ,sizeof (p[0 ])); printf ("%d\n" ,sizeof (&p)); printf ("%d\n" ,sizeof (&p+1 )); printf ("%d\n" ,sizeof (&p[0 ]+1 )); printf ("%d\n" ,strlen (p)); printf ("%d\n" ,strlen (p+1 )); printf ("%d\n" ,strlen (*p)); printf ("%d\n" ,strlen (p[0 ])); printf ("%d\n" ,strlen (&p)); printf ("%d\n" ,strlen (&p+1 )); printf ("%d\n" ,strlen (&p[0 ]+1 ));
④二维数组 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 int a[3 ][4 ] = {0 };printf ("%d\n" ,sizeof (a)); printf ("%d\n" ,sizeof (a[0 ][0 ])); printf ("%d\n" ,sizeof (a[0 ])); printf ("%d\n" ,sizeof (a[0 ]+1 )); printf ("%d\n" ,sizeof (*(a[0 ]+1 )) ); printf ("%d\n" ,sizeof (a+1 )); printf ("%d\n" ,sizeof (*(a+1 ))); printf ("%d\n" ,sizeof (&a[0 ]+1 )); printf ("%d\n" ,sizeof (*(&a[0 ]+1 ))); printf ("%d\n" ,sizeof (*a)); printf ("%d\n" ,sizeof (a[3 ]));
三、函数指针 1.函数指针的介绍
函数指针即
指向函数的指针 存放函数地址的指针
前面我们知道,在数组当中&(数组名) != 数组名
但是在函数指针中
&(函数名) == 函数名
函数指针的创建和使用方式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 int Add (int x,int y) { return x+y; } int main () { int a = 1 ; int b = 2 ; int (*pf)(int , int ) = &Add; int (*pf)(int , int ) = Add; int ret = (*pf)(a,b); int ret = (******pf)(a,b); int ret = pf(a,b); int ret = Add(a,b); int ret = * pf(a,b); return 0 ; }
2.函数指针数组 我们以一段代码来展示以下函数指针数组的创建和使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 int Add (int a,int b) { return a+b; } int Sub (int a,int b) { return a-b; } int main () { int (*pA)(int ,int ) = Add; int (*pS)(int ,int ) = Sub; int (*parr[2 ])(int ,int ) = {Add,Sub};
四、回调函数
回调函数就是 一个通过函数指针调用的函数
举一个简单的例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 int Add (int a,int b) { return a+b; } int Sub (int a,int b) { return a-b; } int all ( int (*pf)(int ,int ) ) { int x = 0 ; int y = 0 ; scanf ("%d %d" ,&x,&y); return pf(x,y); }