学习目标:
- 进一步了解指针
学习内容:
字符指针
数组指针
指针数组
数组传参和指针传参
函数指针
函数指针数组
指向函数指针数组的指针
回调函数(在下一篇写)
1.1字符指针
类型是字符的指针:
int main() { char ch = 'w'; char* pc = &ch; *pc = 'w'; const char* pstr = "hello world.";//这里是把一个字符串放到pstr指针变量里了吗? printf("%s\n", pstr); return 0; }
2.1指针数组
存放指针的数组:
int arr[4];
int* ptr[5];
char* ptr1[5];
3.数组指针
数组指针是指向数组的指针
int (*p)[10];
就是一个数组指针,*号先和p结合,说明他是一个指针指向一个大小为十的数组,每一个元素是整型。所以p是一个数组指针
3.1数组名和&数组名
数组名是数组首元素地址,&数组名是整个数组的地址,但是最初都是指向第一个元素的地址。
这里,&arr的类型是 int (*) [] ;是一个数组指针类型
3.2数组指针的使用
void print1(int arr[4][5], int c, int r) { int i = 0; int j = 0; for (i = 0; i < r; i++) { for (j = 0; j < c; j++) { printf("%d ", arr[i][j]); } printf("\n"); } } void print2(int(*p)[5], int c, int r)//二维数组可以看作四个一维数组,*p是每一个一维数组的//地址 { int i = 0; int j = 0; for (i = 0; i < r; i++) { for (j = 0; j < c; j++) { printf("%d ", p[i][j]); } printf("\n"); } } int main() { int c = 0; int r = 0; int arr[4][5]={{1,2,3,3,4},{2,3,2,3,2},{4,6,4,3,2},{4,4,6,3,7}}; int(*ptr)[5] = &arr; //print1(arr, 5, 4); print2(arr, 5, 4); return 0; }
从下图可以看出,数组指针加1跳过一个数组的空间
4。数组传参和指针传参
void test(int arr[])//ok? { printf("ok"); } void test(int arr[10])//ok? {} void test(int* arr)//ok? {} void test2(int* arr[20])//ok? {} void test2(int** arr)//ok? {} int main() { int arr[10] = { 0 }; int* arr2[20] = { 0 }; test(arr); test2(arr2); return 0; } 以上一维数组传参都是正确的
二维数组传参
void test3(int arr[3][4]) {} void test1(int(*a)[4] ) { printf("%d \n", *(a[1]+1)); } void test2(int arr[][4]){} int main() { int arr[3][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12} }; test1(arr); test2(arr); return 0; }
5。函数指针
函数test的地址,加与不加&符号地址都是一样。
同样对函数指针pa,解引用与不解引用,结果都是一样,所以pa(2,3)的pa不用解引用
6.函数指针数组
我们知道指针数组是存放指针的数组
那函数指针数组就是存放函数指针的数组
int (*Pa[4])(int x,int y);
因为Pa[]是数组,int (*) ()z是函数指针类型
例子就是计算器
void print() { printf("----------------\n"); printf("--1.add 2.sub--\n"); printf("--3.mul 4.div--\n"); printf("------0.exit----\n"); } 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 x = 0; int y = 0; int input = 0; print(); printf("请选择->"); int (*pa[5])(int x,int y) = { 0,add,sub,mul,div }; while (scanf("%d", &input) != EOF) { if (input >= 1 && input <= 4) { printf("请输入两个操作数:"); scanf("%d %d", &x, &y); printf("%d\n", ( * pa[input])(x, y)); printf("请选择->"); } else if (0 == input) { break; } else printf("输入错误!!\n"); } return 0; }
7、指向函数指针数组的指针
int ( *(*p[5]) ) (int x,int y)
void test() {} void test1() {} int main() { int (* pa[4])(int x, int y) ; pa[0] = test; void (*(*ppa)[1])() = &pa; printf("%p\n", pa[0]); printf("%p\n", *ppa[0]); return 0; }
学习时间:
二零二二年九月二十日
学习产出:
- 复习技术笔记 2 遍
- CSDN 技术博客 1 篇
- 习的 vlog 视频 1 个