• 对各种指针,数组的联立回顾复习(字符指针,指针数组,数组指针,函数指针,函数指针数组)


    对于指针与数组的联立,如今笔者到此将近讲解完毕,所以笔者打算来一篇回顾复习一下!!一来满足笔者复习回顾的愿望,又能给读者提供一些便利!!何乐而不为??

    字符指针!指针数组!!数组指针!!!函数指针!!!!函数指针数组!!!!!总结性回顾!

    1.首先来简单回顾一下字符指针

    1. int main()
    2. {
    3. //char * 类型
    4. char ch = 'w';
    5. char* pc = &ch;
    6. char* ps = "abcdef";
    7. //准确的写法为:
    8. const char* ps = "abcdef";
    9. }

     对于字符 char类型,因此,字符指针为:char * 类型!

    对于:char* ps = "abcdef";   准确的写法为:    const  char* ps = "abcdef";  const修饰指针,放在*左边,限制的为:*ps; 表示ps所指向的对象*ps不能被修改!!而对于:"abcdef"是一个字符串,该"abcdef"字符串的值为:a的地址,存放在指针变量里面(char *);

    下面请看笔者的完整代码:

    1. #include <stdio.h>
    2. int main()
    3. {
    4. //char * 类型
    5. char ch = 'w';
    6. char* pc = &ch;
    7. //char* ps = "abcdef";
    8. //准确的写法为:
    9. const char* ps = "abcdef";
    10. printf("%s\n", ps);
    11. printf("%c\n", *ps); //这个是对字符串的值是a的地址的最好证明!
    12. return 0;
    13. }

    代码的运行结构为:

    思考一下:字符指针的训练:

    1. int main()
    2. {
    3. char str1[] = "abcdef";
    4. char str2[] = "abcdef";
    5. const char* str3 = "abcdef";
    6. const char* str4 = "abcdef";
    7. if (str1 == str2)
    8. printf("str1 == str2\n");
    9. else
    10. printf("str1 != str2\n");
    11. if (str3 == str4)
    12. printf("str3 == str4\n");
    13. else
    14. printf("str3 != str4\n");
    15. return 0;
    16. }

    请大家思考一下!!然后自行在vs里面寻找答案!在此,笔者就不做更多的讲解!

    2.笔者来带领大家简单回顾一下 :指针数组!

         概念:指针数组本质上是数组,存放指针的数组;

    📌 注意:不要和数组指针混淆,数组指针本质上是指针;

     对于指针数组,到目前为止:想必读者的第一想法,一定将是:存放数组的指针!!

     

    对于指针,我们有着:

    1. char *
    2. int *
    3. char **

    对于上述的指针,读者也能自己想起来!!相信读者实力强强!!

    请看笔者的简单使用:

    1. int main()
    2. {
    3. char* arr[4];
    4. //存放字符型指针的数组
    5. int* arr2[8];
    6. //存放整型指针的数组
    7. return 0;
    8. }

    分析下面的数组:

    int arr1[5];
    char arr2[6];
    int* arr3[5];
    

    🔑 解析:

         ① arr1 是一个整型数组,有 5 个元素,每个元素都是一个 整型;

         ② arr2 是一个字符数组,有 6 个元素,每个元素都是一个 char 型;

         ③ arr3 是一个整型指针数组,有 5 个元素,每个元素是一个 整型指针;

     

    指针数组的用法:

    1. #include <stdio.h>
    2. int main()
    3. {
    4. int arr1[] = {1, 2, 3, 4, 5};
    5. int arr2[] = {2, 3, 4, 5, 6};
    6. int arr3[] = {3, 4, 5, 6, 7};
    7. int* p[] = { arr1, arr2, arr3 }; // 首元素地址
    8. int i = 0;
    9. for(i=0; i<3; i++) {
    10. int j = 0;
    11. for(j=0; j<5; j++) {
    12. printf("%d ", *(p[i] + j)); // j-> 首元素+0,首元素+1+2...
    13. // == p[i][j]
    14. }
    15. printf("\n");
    16. }
    17. return 0;
    18. }

     代码的运行结果为:

     

    3.数组指针的简单回顾!

    1. int main()
    2. {
    3. int a = 10;
    4. int* pa = &a;
    5. char ch = 'w';
    6. char* pc = &ch;
    7. int arr[10] = {1,2,3,4,5};
    8. int (*parr)[10] = &arr; // 取出的是数组的地址
    9. // parr 就是一个数组指针
    10. return 0;
    11. }

    数组指针的用法:一般在二维数组中使用较多!

    1. void print1 (
    2. int arr[3][5],
    3. int row,
    4. int col
    5. )
    6. {
    7. int i = 0;
    8. int j = 0;
    9. for(i=0; i<row; i++) {
    10. for(j=0; j<col; j++) {
    11. printf("%d ", arr[i][j]);
    12. }
    13. printf("\n");
    14. }
    15. }
    16. void print2 (
    17. int(*p)[5], // 数组指针,指向二维数组的某一行
    18. int row,
    19. int col
    20. )
    21. {
    22. int i = 0;
    23. int j = 0;
    24. for(i=0; i<row; i++) {
    25. for(j=0; j<col; j++) {
    26. printf("%d ", *(*(p + i) + j));
    27. // printf("%d ", (*(p + i))[j]);
    28. // printf("%d ", *(p[i] + j));
    29. // printf("%d ", p[i][j]);
    30. }
    31. printf("\n");
    32. }
    33. }
    34. int main()
    35. {
    36. int arr[3][5] = {{1,2,3,4,5}, {2,3,4,5,6}, {3,4,5,6,7}};
    37. // print1(arr, 3, 5);
    38. print2(arr, 3, 5); // arr数组名,表示元素首元素的地址
    39. return 0;
    40. }

    对于代码的运行结果也是显而易见的:

    4.函数指针的简单讲解!

    用一个代码来进行思考一下!

    1. int add(int x, int y)
    2. {
    3. return x + y;
    4. }
    5. int main()
    6. {
    7. //pf就是函数指针变量!
    8. int (*pf)(int, int) = add;
    9. printf("%d\n", (*pf)(3, 5));
    10. return 0;
    11. }

    代码的运行结果为:

     5函数指针数组详解:

    如果要把函数的地址存到一个数组中,那这个数组就叫 函数指针数组

    💬 函数指针数组的定义:

    1. int Add(int x, int y) {
    2. return x + y;
    3. }
    4. int Sub(int x, int y) {
    5. return x - y;
    6. }
    7. int main()
    8. {
    9. int (*pf)(int, int) = Add;
    10. int (*pf2)(int, int) = Sub;
    11. int (*pfArr[2])(int, int) = {Add, Sub};
    12. // 👆 pfArr 就是函数指针数组
    13. return 0;
    14. }

    函数指针数组的应用!笔者在之前用简单实现计算器来进行讲解过!有意者,请参考之前代码!

    编写程序简单实现计算器:加减乘除功能(函数指针数组的写法)_念君思宁的博客-CSDN博客_设计一个简单的计算器实现加减乘除r

     到此为止,笔者已经将想要表达的内容讲解完毕,这也是笔者的思考!复习的主要内容!请大家仔细思考!!

  • 相关阅读:
    three.js之缓冲类型几何体顶点
    001数据安全传输-多端协议传输平台:Openssl安装和配置 - EVP代码测试
    161_可视化_Power BI 复刻 GitHub 贡献热力图
    R语言矩阵数据初始化:创建全为0的矩阵、全为NA的矩阵、使用byrow参数指定数据排布方式(按行、按列)、dim参数指定矩阵维度信息
    项目进展(一)-晶振正常输出、焊接驱动芯片、查找芯片手册并学习
    react源码分析:组件的创建和更新
    和想象中完全不一样?巡课在线就能进行
    线索二叉树
    带你玩转序列模型之NLP与词嵌入(二)
    VUE2安装初始化步骤(2022)
  • 原文地址:https://blog.csdn.net/weixin_64308540/article/details/126853479