1. 指针语法解剖
- 任意的指针,不管有多复杂,其定义都由两部分组成。
- 第1部分:指针所指向的数据类型,可以是任意的类型
- 第2部分:指针的名字
char (*p1); // 第2部分:*p1; 第1部分:char;
char *(*p2); // 第2部分:*p2; 第1部分:char *;
char **(*p3); // 第2部分:*p3; 第1部分:char **;
char (*p4)[3]; // 第2部分:*p4; 第1部分:char [3];
char (*p5)(int, char); // 第2部分:*p5; 第1部分:char (int, float);
- 注解:
- 上述示例中,p1、p2、p3、p4、p5本质上并无区别,它们均是指针
- 上述示例中,p1、p2、p3、p4、p5唯一的不同,是它们所指向的数据类型不同
- 第1部分的声明语句,如果由多个单词组成,C语言规定需要将其拆散写到第2部分的两边
char (*p1);
表示 p1
是一个指向 char
类型的指针。
这意味着 p1
可以指向一个 char
类型的变量。
示例代码:
char c = 'A'; // 声明一个 char 类型的变量 c,并赋值为 'A'
char *p1; // 声明一个指向 char 类型的指针 p1
p1 = &c; // 将 p1 指向变量 c 的地址// 输出 p1 指向的字符
printf("p1 points to: %c\n", *p1); // 输出:p1 points to: A
char *(*p2);
表示 p2
是一个指向指向 char
类型的指针的指针。
这意味着 p2
可以指向一个 char*
类型的变量(字符串指针)。
示例代码:
char *str = "Hello"; // 声明并初始化一个字符串指针变量 str
char **p2; // 声明一个指向指向 char 类型的指针的指针 p2
p2 = &str; // 将 p2 指向字符串指针 str 的地址// 输出 p2 指向的字符串
printf("p2 points to: %s\n", *p2); // 输出:p2 points to: Hello
char **(*p3);
表示 p3
是一个指向指向指向 char
类型的指针的指针的指针。
这意味着 p3
可以指向一个指向字符串指针的指针的变量。
示例代码:
char *strs[] = {"One", "Two", "Three"}; // 声明并初始化一个字符串指针数组 strs
char **p3; // 声明一个指向指向 char 类型的指针的指针的指针 p3
p3 = &strs; // 将 p3 指向字符串指针数组 strs 的地址// 输出 p3 指向的字符串指针
printf("p3 points to: %s\n", **p3); // 输出:p3 points to: One// 输出 p3 指向的字符串指针数组中的每个字符串
for (int i = 0; i < 3; i++) {printf("Element %d: %s\n", i, *(*p3 + i));
}
// 遍历输出结果
Element 0: One
Element 1: Two
Element 2: Three
char (*p4)[3];
表示 p4
是一个指向长度为3的 char
数组的指针。
这意味着 p4
可以指向一个长度为3的 char
数组。
示例代码:
char arr[] = {'A', 'B', 'C'}; // 声明并初始化一个长度为3的 char 数组 arr
char (*p4)[3]; // 声明一个指向长度为3的 char 数组的指针 p4
p4 = &arr; // 将 p4 指向数组 arr 的地址// 通过 p4 解引用输出数组元素
for (int i = 0; i < 3; i++) {printf("%c ", (*p4)[i]);
}//输出结果
A B C
char (*p5)(int, char);
表示 p5
是一个指向函数的指针,这个函数接受一个 int
类型和一个 char
类型的参数,并返回 char
类型的值。
这意味着 p5
可以指向具有特定参数和返回类型的函数。
示例代码:
char myFunction(int num, char ch) {// 实现函数功能的代码return ch + num;
}char (*p5)(int, char); // 声明一个指向函数的指针 p5
p5 = &myFunction; // 将 p5 指向函数 myFunction// 调用通过 p5 指向的函数
char result = (*p5)(3, 'A');
printf("Result: %c\n", result);//输出结果
Result: D