• C进阶——指针详解


    目录

    一、字符指针

    二、数组指针

    三、指针数组

    四、函数指针

    五、函数指针数组

    六、指向函数指针数组的指针


    一、字符指针

    在指针的类型中我们知道有一种指针类型为字符指针 char* 

    1. int main()
    2. {
    3.    const char* pstr = "hello bit.";
    4.    printf("%s\n", pstr);
    5.    return 0;
    6. }
    很多同学以为是把字符串 hello bit 放到字符指针 pstr 里了,但是 本质是把字符串 hello bit的首字符的地址放到了 pstr 中。

      

    那下面的这道题的结果又是什么呢?

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

    这里 str3 str4 指向的是一个同一个常量字符串。 C/C++ 会把常量字符串存储到单独的一个内存区域,当几个指针指向同一个字符串的时候,他们实际会指向同一块内存。但是用相同的常量字符串去初始化 不同的数组的时候就会开辟出不同的内存块。所以str1 str2 不同, str3 str4 不同。

    二、数组指针

    指针数组是一个存放指针的数组。
    1. int* arr1[10]; //整形指针的数组
    2. char *arr2[4]; //一级字符指针的数组
    3. char **arr3[5];//二级字符指针的数组

    三、指针数组

    数组指针本质上还是指针。
    我们已经熟悉:
            整形指针: int * pint ; ( 能够指向整形数据的指针)。
            浮点型指针: float * pf ; ( 能够指向浮点型数据的指针)。
    那数组指针应该是:能够指向数组的指针。
    下面代码哪个是数组指针?
    1. int *p1[10];
    2. int (*p2)[10];

    答案是:int (*p)[10];

    解释:p先和*结合,说明p是一个指针变量,然后指着指向的是一个大小为10个整型的数组。所以p是一个 指针,指向一个数组,叫数组指针。

    注:[ ]的优先级要高于*号的,所以必须加上()来保证p先和*结合。

    四、函数指针

    函数指针本质上是指针。

    首先看一段代码:
    1. #include
    2. void test()
    3. {
    4. printf("hehe\n");
    5. }
    6. int main()
    7. {
    8. printf("%p\n", test);
    9. printf("%p\n", &test);
    10. return 0;
    11. }

    输出的是两个地址,这两个地址都是 test 函数的地址。

    那我们的函数的地址要想保存起来,怎么保存?

    1. void test()
    2. {
    3. printf("hehe\n");
    4. }
    5. int mian()
    6. {
    7. void (*ptest2)() = &test;
    8. return 0;
    9. }
    解释:pfun1 先和 * 结合,说明 pfun1 是指针,指针指向的是一个函数,指向的函数无参 数,返回值类型为void

    五、函数指针数组

    数组是一个存放相同类型数据的存储空间,那要把函数的地址存到一个数组中,这个数组就叫函数指针数组,那函数指针的数组如何定义呢?

    1. int (*parr1[10])();
    2. int *parr2[10]();
    3. int (*)() parr3[10];
    答案是: parr1
    parr1 先和 [ ] 结合,说明 parr1 是数组,数组的内容是什么呢?
    int (*)() 类型的函数指针。

    六、指向函数指针数组的指针

    指向函数指针数组的指针是一个 指针,指针指向一个数组, 数组的元素都是 函数指针。
    1. void test(const char* str)
    2. {
    3. printf("%s\n", str);
    4. }
    5. int main()
    6. {
    7. void (*pfun)(const char*) = test; //函数指针pfun
    8. void (*pfunArr[5])(const char* str); //函数指针的数组pfunArr
    9. pfunArr[0] = test;
    10. void (*(*ppfunArr)[5])(const char*) = &pfunArr; //指向函数指针数组pfunArr的指针ppfunArr
    11. return 0;
    12. }

     

  • 相关阅读:
    2024.3.14 C++
    【python】python的标准库——sys模块介绍
    Node 基础
    ChatGPT无限可能性:自然语言生成的奥秘
    Day722. 空指针烦恼 -Java8后最重要新特性
    半导体行业如何在跨网数据交换时保证核心数据是安全的?
    动态负荷对电力系统摆幅曲线的影响研究(Matlab代码实现)
    【TypeScript】基础知识学习笔记
    ATM机模拟系统
    学习心得08:OpenGL
  • 原文地址:https://blog.csdn.net/xh1605004242/article/details/126701013