• 2024龙年特别篇 -- 魔法指针 之 指针变量


    目录

    ​编辑

     字符指针变量

    字符指针

    字符数组

    关于字符数组的试题

     数组指针变量

    数组指针

     利用指针数组打印数组

     打印二维数组

    数组作为形参

     当形参为指针时(指针数组)

    函数指针变量

     利用函数实现加法输出的多种方式


     字符指针变量

    字符指针

    char ch = ' w ';

    char* pc = &ch;  //取ch的地址

    含有 char* 叫字符指针

    字符数组

    1. int main()
    2. {
    3. char ch[] = "abcdefg";
    4. char* pc = &ch;
    5. printf("%c\n", *pc);
    6. printf("%c\n", pc[4]);
    7. printf("%c\n", "abcdefg"[4]);
    8. return 0;
    9. }

    代码解释 

    以上👆代码中:

    1.ch 是个数组,里面存放着的值为 “abcdefg” 

    2.pc 是指向 ch字符数组的一个指针

    此外,字符数组还有另一种表达方式

    1. int main()
    2. {
    3. const char* pc = "abcdefg";
    4. printf("%c\n", *pc);
    5. printf("%c\n", pc[4]);
    6. printf("%c\n", "abcdefg"[4]);
    7. return 0;
    8. }

    控制台结果显示

    代码解释

    1. pc 是指向常量字符串 " abcdefg " 的一个指针

    2.而且常量字符串不能修改!!!

     

    关于字符数组的试题

    该试题是在《剑指offer》的一道笔试题,已经过稍微改动 

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

    看看这四个代码两两之间有什么区别? 

    代码解释

     


     数组指针变量

    数组指针

    定义:int( * p)[n]; (注意优先级:()>[]> *)

    栗子:(int (*p)[6]定义了一个指向含有6个元素的一维数组的指针。)

    说明:

    1.()优先级高,说明p是指针,指向一个整型的一维数组。

    2.这个一维数组的长度是n,也可以说p的步长为n。

    3.当p+1时,p指针会跨过n个整型数据的长度。

     利用指针数组打印数组

    1. int main()
    2. {
    3. int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
    4. int sz = sizeof(a) / sizeof(a[0]);
    5. int(*p)[10] = &a;
    6. int i = 0;
    7. for (i = 0; i < sz; i++)
    8. {
    9. printf("%d ", (*p)[i]);
    10. }
    11. printf("\n");
    12. return 0;
    13. }

    控制台结果显示: 


     打印二维数组

    数组作为形参

    row 行

    cow 列 

    1. void Print(int a[2][3], int r, int c)
    2. {
    3. int i = 0;
    4. for (i = 0; i < r; i++)
    5. {
    6. int j = 0;
    7. for (j = 0; j < c; j++)
    8. {
    9. printf("%d ", a[i][j]);
    10. }
    11. printf("\n");
    12. }
    13. }
    14. int main()
    15. {
    16. int a[2][3] = { {1,2,3},{4,5,6} };
    17. //打印数组
    18. Print(a, 2, 3);
    19. return 0;
    20. }

    代码解释

    在主函数 Print(a,2,3)中,

    1.a表示数组首元素的地址

    2.a[2][3]表示二行三列这个具体的值

     当形参为指针时(指针数组)

    1. void Print(int(*p)[3], int r, int c)
    2. {
    3. int i = 0;
    4. for (i = 0; i < r; i++)
    5. {
    6. int j = 0;
    7. for (j = 0; j < c; j++)
    8. {
    9. printf("%d ", *(*(p + i) + j));
    10. }
    11. printf("\n");
    12. }
    13. }
    14. int main()
    15. {
    16. int a[2][3] = { {1,2,3},{4,5,6} };
    17. Print(a, 2, 3);
    18. return 0;
    19. }

    代码解释

    上面👆代码中:

    void Print(int(*p)[3], int r, int c)

    这个涉及到二维数组传参的本质:

    传递的是地址,传的是一维数组第一行的地址

    控制台结果显示:

    函数指针变量

    函数指针变量:是用来存放函数指针地址的

    我们先理解下面表格

    表示
    数组名数组首元素的地址
    &数组名整个数组的地址

    表示
    函数函数的地址
    &函数函数的地址

     利用函数实现加法输出的多种方式

    1. int Add(int x, int y)
    2. {
    3. return x + y;
    4. }
    5. int main()
    6. {
    7. /*原始输出方式*/
    8. int ret = Add(3, 6);
    9. printf("ret = %d\n", ret);
    10. /*利用函数指针变量输出*/
    11. /*输出方式一*/
    12. int(*p1)(int, int) = &Add;
    13. int ret1 = Add(2,9);
    14. printf("ret1 = %d\n", ret1);
    15. /*输出方式二*/
    16. int(*p2)(int, int) = Add;
    17. int ret2 = Add(2, 8);
    18. printf("ret2 = %d\n", ret2);
    19. /*输出方式三*/
    20. int(*p3)(int, int) = Add;
    21. int ret3 = (p3)(4, 7);
    22. printf("ret3 = %d\n", ret3);
    23. return 0;
    24. }

    控制台结果输出

    关于函数指针我在这篇文章中详细讲过:函数指针


     ***********************************************************分割线*****************************************************************************
    完结!!!
    感谢浏览和阅读。
    等等等等一下,分享最近喜欢的一句话:

    “知不足而奋进,望远山而前行”。

    我是白子寰,如果你喜欢我的作品,不妨你留个点赞+关注让我知道你曾来过。
    你的点赞和关注是我持续写作的动力!!! 
    好了划走吧。

     

  • 相关阅读:
    面试必问 创建10个a点击弹出下标
    全栈软件测试工程师技术涨薪进阶路径图(附资料)
    计算机网络——TCP/IP模型
    25 DRF详细学习篇章二|Parsers|Renderers|Serializers
    怎样把网页上的音频转换成mp3格式?试试这几个转换方法
    GitHub限时开源36小时的阿里Java架构师学习手册,上线即标星35k+
    RHCE-ansible(一)--- 安装ansible、主机清单、sudo提权、特权升级
    Pandas数据分析20——pandas窗口计算
    查看 OceanBase 执行计划
    java-php-python-ssm点餐系统计算机毕业设计
  • 原文地址:https://blog.csdn.net/Sweeney_001/article/details/136421347