对于指针与数组的联立,如今笔者到此将近讲解完毕,所以笔者打算来一篇回顾复习一下!!一来满足笔者复习回顾的愿望,又能给读者提供一些便利!!何乐而不为??
字符指针!指针数组!!数组指针!!!函数指针!!!!函数指针数组!!!!!总结性回顾!
1.首先来简单回顾一下字符指针!
- int main()
- {
- //char * 类型
- char ch = 'w';
- char* pc = &ch;
-
- char* ps = "abcdef";
- //准确的写法为:
- const char* ps = "abcdef";
- }
对于字符 char类型,因此,字符指针为:char * 类型!
对于:char* ps = "abcdef"; 准确的写法为: const char* ps = "abcdef"; const修饰指针,放在*左边,限制的为:*ps; 表示ps所指向的对象*ps不能被修改!!而对于:"abcdef"是一个字符串,该"abcdef"字符串的值为:a的地址,存放在指针变量里面(char *);
下面请看笔者的完整代码:
- #include <stdio.h>
- int main()
- {
- //char * 类型
- char ch = 'w';
- char* pc = &ch;
-
- //char* ps = "abcdef";
- //准确的写法为:
- const char* ps = "abcdef";
- printf("%s\n", ps);
- printf("%c\n", *ps); //这个是对字符串的值是a的地址的最好证明!
- return 0;
- }
代码的运行结构为:

思考一下:字符指针的训练:
- int main()
- {
- char str1[] = "abcdef";
- char str2[] = "abcdef";
- const char* str3 = "abcdef";
- const char* str4 = "abcdef";
-
- if (str1 == str2)
- printf("str1 == str2\n");
- else
- printf("str1 != str2\n");
-
- if (str3 == str4)
- printf("str3 == str4\n");
- else
- printf("str3 != str4\n");
-
- return 0;
- }
请大家思考一下!!然后自行在vs里面寻找答案!在此,笔者就不做更多的讲解!
2.笔者来带领大家简单回顾一下 :指针数组!
概念:指针数组本质上是数组,存放指针的数组;
📌 注意:不要和数组指针混淆,数组指针本质上是指针;
对于指针数组,到目前为止:想必读者的第一想法,一定将是:存放数组的指针!!
对于指针,我们有着:
- char *
- int *
- char **
对于上述的指针,读者也能自己想起来!!相信读者实力强强!!
请看笔者的简单使用:
- int main()
- {
- char* arr[4];
- //存放字符型指针的数组
- int* arr2[8];
- //存放整型指针的数组
- return 0;
-
- }
分析下面的数组:
int arr1[5]; char arr2[6]; int* arr3[5];
🔑 解析:
① arr1 是一个整型数组,有 5 个元素,每个元素都是一个 整型;
② arr2 是一个字符数组,有 6 个元素,每个元素都是一个 char 型;
③ arr3 是一个整型指针数组,有 5 个元素,每个元素是一个 整型指针;

指针数组的用法:
- #include <stdio.h>
-
- int main()
- {
- int arr1[] = {1, 2, 3, 4, 5};
- int arr2[] = {2, 3, 4, 5, 6};
- int arr3[] = {3, 4, 5, 6, 7};
-
- int* p[] = { arr1, arr2, arr3 }; // 首元素地址
-
- int i = 0;
- for(i=0; i<3; i++) {
- int j = 0;
- for(j=0; j<5; j++) {
- printf("%d ", *(p[i] + j)); // j-> 首元素+0,首元素+1,+2...
- // == p[i][j]
- }
- printf("\n");
- }
-
- return 0;
- }

代码的运行结果为:

3.数组指针的简单回顾!
- int main()
- {
- int a = 10;
- int* pa = &a;
- char ch = 'w';
- char* pc = &ch;
-
- int arr[10] = {1,2,3,4,5};
- int (*parr)[10] = &arr; // 取出的是数组的地址
- // parr 就是一个数组指针
-
- return 0;
- }
数组指针的用法:一般在二维数组中使用较多!
- void print1 (
- int arr[3][5],
- int row,
- int col
- )
- {
- int i = 0;
- int j = 0;
- for(i=0; i<row; i++) {
- for(j=0; j<col; j++) {
- printf("%d ", arr[i][j]);
- }
- printf("\n");
- }
- }
-
- void print2 (
- int(*p)[5], // 数组指针,指向二维数组的某一行
- int row,
- int col
- )
- {
- int i = 0;
- int j = 0;
- for(i=0; i<row; i++) {
- for(j=0; j<col; j++) {
- printf("%d ", *(*(p + i) + j));
- // printf("%d ", (*(p + i))[j]);
- // printf("%d ", *(p[i] + j));
- // printf("%d ", p[i][j]);
- }
- printf("\n");
- }
- }
-
- int main()
- {
- int arr[3][5] = {{1,2,3,4,5}, {2,3,4,5,6}, {3,4,5,6,7}};
- // print1(arr, 3, 5);
- print2(arr, 3, 5); // arr数组名,表示元素首元素的地址
-
- return 0;
- }
对于代码的运行结果也是显而易见的:

4.函数指针的简单讲解!
用一个代码来进行思考一下!
- int add(int x, int y)
- {
- return x + y;
- }
- int main()
- {
- //pf就是函数指针变量!
- int (*pf)(int, int) = add;
- printf("%d\n", (*pf)(3, 5));
- return 0;
- }
代码的运行结果为:

5函数指针数组详解:
如果要把函数的地址存到一个数组中,那这个数组就叫 函数指针数组
![]()
💬 函数指针数组的定义:
- int Add(int x, int y) {
- return x + y;
- }
-
- int Sub(int x, int y) {
- return x - y;
- }
-
- int main()
- {
- int (*pf)(int, int) = Add;
- int (*pf2)(int, int) = Sub;
-
- int (*pfArr[2])(int, int) = {Add, Sub};
- // 👆 pfArr 就是函数指针数组
-
- return 0;
- }
函数指针数组的应用!笔者在之前用简单实现计算器来进行讲解过!有意者,请参考之前代码!
编写程序简单实现计算器:加减乘除功能(函数指针数组的写法)_念君思宁的博客-CSDN博客_设计一个简单的计算器实现加减乘除r
到此为止,笔者已经将想要表达的内容讲解完毕,这也是笔者的思考!复习的主要内容!请大家仔细思考!!