字符指针!指针数组!!数组指针!!!函数指针!!!!函数指针数组!!!!!总结性回顾!
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; }
函数指针数组的应用!笔者在之前用简单实现计算器来进行讲解过!有意者,请参考之前代码!