目錄
一、字符指針變量
1 初始化
2 與字符串數組的區別
二、數組指針變量?
1 初始化
2 二維數組傳參本質
三、函數指針變量
1 初始化
2 用法?
四、typedef關鍵字
五、函數指針數組
一、字符指針變量
1 初始化
//VS2022 x64
#include <stdio.h>
int main()
{char* p = 'w'; //字符指針變量char* pc = "abcdef"; //pc 里存放的是字符串首元素的地址printf("%s", pc); //輸出 abcdefreturn 0;
}
2 與字符串數組的區別
#include <stdio.h>
int main()
{char arr1[] = "abcd";char arr2[] = "abcd";char* pc1 = "abcd";char* pc2 = "abcd";if (arr1 == arr2) //判斷存儲的地址是否一樣printf("arr1 和 arr2 一樣\n");elseprintf("arr1 和 arr2 不一樣\n");if(pc1 == pc2) //判斷存儲的地址是否一樣printf("pc1 和 pc2 一樣\n");elseprintf("pc1 和 pc2 不一樣\n");return 0;
}//輸出
//arr1 和 arr2 不一樣
//pc1 和 pc2 一樣
?
二、數組指針變量?
1 初始化
#include <stdio.h>
int main()
{//類比一下//整型指針變量int a = 10;int* p1 = &a; //指針類型:int*int arr[5] = { 0,1,2,3,4 };//整型指針變量int* p = arr; //指針類型:int* 指向數組首元素地址//數組指針變量int(*p)[5] = &arr; //指針類型:int(*)[5] 指向整個數組地址return 0;
}
2 二維數組傳參本質
原來的格式
#include <stdio.h>
void func(int arr[3][3])
{for (int i = 0; i < 3; i++){for (int j = 0; j < 3; j++){printf("%d ", arr[i][j]);}printf("\n");}
}int main()
{int arr[3][3] = { {1,2,3},{2,3,4},{3,4,5} };func(arr); //傳的是數組首元素地址return 0;
}
根據數組名是數組首元素的地址這個規則,二維數組的數組名表示的就是第一行的地址,是一維數組的地址。根據上面的例子,第一行的一維數組的類型就是?int[3] ,所以第一行的地址的類型就是數組指針類型 int(*)[3] 。那就意味著二維數組傳參本質上也是傳遞了地址,傳遞的是第一行這個一維數組的地址,那么形參也是可以寫成指針形式的。?
void func(int (*p)[3])
{for (int i = 0; i < 3; i++){for (int j = 0; j < 3; j++){printf("%d ", p[i][j]); //等同于*( *(p + i) + j)}printf("\n");}
}int main()
{int arr[3][3] = { {1,2,3},{2,3,4},{3,4,5} };func(arr);return 0;
}
三、函數指針變量
1 初始化
函數是有地址的,函數名就是函數的地址,當然也可以通過 &函數名 的方式獲得函數的地址。
#include <stdio.h>
int Add(int a,int b)
{return a + b;
}int main()
{int a = 0;int b = 0;Add(a,b);int (*p1)(int, int) = &Add;int (*p2)(int,int) = Add;printf("%p\n", p1);printf("%p\n", p2);return 0;
}//輸出
//00007FF6EA2413CA
//00007FF6EA2413CA
2 用法?
通過函數指針調用指針指向的函數
#include <stdio.h>
int Add(int a, int b)
{return a + b;
}int main()
{int a = 5;int b = 5;int (*p1)(int, int) = Add;printf("%d\n", p1(a, b)); //等同于Add(a, b)return 0;
}//輸出
//10
四、typedef關鍵字
typedef 是用來類型重命名的,可以將復雜的類型,簡單化。
//將 unsigned int 重命名為 uint
typedef unsigned int uint;
但是對于數組指針和函數指針稍微有點區別:新的類型名必須在 * 的右邊
//將 int(*)[5] 重命名為 pa_int
typedef int(*pa_int)[5];
//將 int(*)(int, int) 重命名為pf_int
typedef int(*pf_int)(int, int);
五、函數指針數組
存放指針的數組稱為指針數組,存放函數指針的數組稱為函數指針數組
int(*pf[3])(int, int);
pf?先和 [ ] 結合,說明 pf 是數組,數組的內容是 int (*)(int, int) 類型的函數指針。
完?