Hello大家好! 很高兴与大家见面! 给生活添点快乐,开始今天的编程之路。
2.1单个字符和字符数组、

两种指向关系

2.2 字符数组和常量‘字符串

注意
1代码char* pc = "abcdef"; 特别容易让同学以为是把字符串 abcdef 放 到字符指针 pc ⾥了,但是本质是把字符串 abcdef. ⾸字符的地址放到了pc中。上⾯代码的意思是把⼀个常量字符串的⾸字符 a的地址存放到指针变量pc中。
2字符数组中可以存放字符串,并且字符数组的内容可以修改,而常量字符串,和数组是非常相似的,也是在一个连续空间中存放多个字符,但是常量字符串中的内容不可以修改。
2.3我们知道常量字符串中的内容是不可以修改,那怎么防止常量字符串中的内容修改呢?这时候就要用const修饰。

这⾥str3和str4指向的是⼀个同⼀个常量字符串。C/C++会把常量字符串存储到单独的⼀个内存区域,当⼏个指针指向同⼀个字符串的时候,他们实际会指向同⼀块内存。但是⽤相同的常量字符串去初始 化不同的数组的时候就会开辟出不同的内存块。所以str1和str2不同,str3和str4相同。
1定义:
•整形指针变量: int * pint; 存放的是整形变量的地址,能够指向整形数据的指针。
• 浮点型指针变量: float * pf; 存放浮点型变量的地址,能够指向浮点型数据的指针。
那数组指针变量应该是:存放的应该是数组的地址,能够指向数组的指针变量 。
2形式
1 int (*p)[ 10];
p先和*结合,说明p是⼀个指针变量,然后指针指向的是⼀个⼤⼩为10个整型的数组。所以p是⼀个指针,指向⼀个数组,叫数组指针。
这⾥要注意:因为[]的优先级要⾼于*号的,所以必须加上()来保证p先和*结合。
3 数组指针变量的初始化

int (*p) [ 10 ] = &arr; | | | | | | | | p 指向数组的元素个数 | p 是数组指针变量名 p 指向的数组的元素类型
1第一种(注意看其形参部分和第二种比较)

2 第二种
⼆维数组其实可以看做是每个元素是⼀维数组的数组,也就是⼆维数组的每个元素是⼀个⼀维数组。那么⼆维数组的⾸元素就是第⼀⾏,是个⼀维数组。再根据数组名是数组⾸元素的地址这个规则,⼆维数组的数组名表⽰的就是第⼀⾏的地址,是⼀维数组的地址。那就意味着⼆维数组传参本质上也是传递了地址,传递的是第⼀⾏这个⼀维数组的地址。

总结
1⼆维数组的每个元素是⼀个⼀维数组。那么⼆维数组的⾸元素就是第⼀⾏,是个⼀维数组。着⼆维数组传参本质上也是传递了地址,传递的是第⼀⾏这个⼀维数组的地址。
2⼆维数组传参,形参的部分可以写成数组,也可以写成指针形式。
1定义/作用:函数指针变量是⽤来存放函数地址的,未来通过地址能够调⽤函数的。
2怎么得到函数地址呢?

函数名就是函数的地址,当然也可以通过&函数名的⽅式获得函数的地址注意这个点要与数组区分数组名就是数组的地址,而&数组名的⽅式获得数组的地址表示整个数组。
3 函数指针类型形式
int (*pf3) ( int x, int y) | | | | | | | | pf3 指向函数的参数类型和个数的交代 | 函数指针变量名 pf3 指向函数的返回类型

4 函数指针变量的使⽤(函数调用)

4 typedef 关键字
4.1 作用:typedef 是⽤来类型重命名的,可以将复杂的类型,简单化。以后想用直接调用自己重命名的即可。
例如 你觉得 unsigned int 写起来不⽅便,如果能写成unit就⽅便多了,那么我们可以使⽤:
typedef unsigned int uint; // 将 unsigned int 重命名为uint 以后想用直接调用unit
4.2 规则:
除数组指针和函数指针其余都用:⽐如,将 int* 重命名为 ptr
typedef int* ptr;
数组指针和函数指针
例如数组指针类型 int(*)[3] ,需要重命名为 parr
typedef int(*parr)[3]; //新的类型名必须在*的右边
例如 函数指针类型的重命名,⽐如,将 void(*)(int) 类型重命名为 pf。
typedef void (* pf )( int ); //新的类型名必须在*的右边
4.3应用

1作用/概念:把函数的地址存到⼀个数组中,那这个数组就叫函数指针数组(用于存放函数的地址)。
2定义
int (*parr1[2])();
parr1 先和 [] 结合,说明 parr1是数组,而数组的内容是 int (*)() 类型的函数指针。
例如 计算器的⼀般实现:
#include <stdio.h> void menu() { printf("****************************\n"); printf("***** 1.add 2.sub ******\n"); printf("***** 3.mul 4.div ******\n"); printf("***** 0. exit ******\n"); printf("****************************\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 input = 0; //转移表例如你选择加减乘除其中一个运算直接运用数组下标来选择。 int (*pfArr[])(int, int) = {NULL, Add, Sub, Mul, Div}; // 0 1 2 3 4 do { menu(); printf("请选择:"); scanf("%d", &input); int a = 0; int b = 0; int r = 0; if(input == 0) printf("退出计算器\n"); else if (input >= 1 && input <= 4) { printf("请输入2个操作数:"); scanf("%d %d", &a, &b); r = pfArr[input](a, b); printf("r = %d\n", r); } else printf("选择错误,重新选择!\n"); } while (input); return 0;
本篇文章就到此结束,希望有所能帮到 读者更好的了解指针,后续还会继续更新指针相关识。