当前位置: 首页 > news >正文

函数指针 指针函数 数组指针 指针数组 常量指针 指针常量

1. 函数指针(指向函数的指针)


        本质:是一个指针变量,专门用来指向函数。函数在内存中占据一块连续空间,其入口地址(函数名代表的地址)可被指针存储,通过该指针可间接调用函数。
        定义格式:返回值类型 (*指针变量名)(参数列表);(*与指针名必须用括号括起,否则会被解析为函数声明)
        示例:
        #include <stdio.h>

        int add(int a, int b) { return a + b; }

        int main() {
            int (*p)(int, int);  // 定义函数指针p,指向返回int、参数为两个int的函数
            p = add;             // 函数名add是地址,赋值给p
            printf("%d\n", p(2, 3));  // 通过指针调用函数,输出5
            return 0;
        }


    2. 指针函数(返回值为指针的函数)


        本质:是一个函数,其返回值类型为指针。重点是 “函数”,只是返回值是指针变量。
        定义格式:返回值类型* 函数名(参数列表);(无括号,*属于返回值类型)
        示例:
        #include <stdio.h>
        #include <stdlib.h>

        int* createArray(int n) {  // 指针函数:返回int*类型
            int* arr = (int*)malloc(n * sizeof(int));
            return arr;
        }

        int main() {
            int* ptr = createArray(5);  // 接收函数返回的指针
            free(ptr);
            return 0;
        }


    3. 数组指针(指向数组的指针)


        本质:是一个指针变量,专门指向整个数组(而非数组元素)。指针的类型与数组的类型一致(包括元素类型和数组长度)。
        定义格式:元素类型 (*指针变量名)[数组长度];(*与指针名用括号括起,否则会被解析为指针数组)
        示例:
        #include <stdio.h>

        int main() {
            int arr[3] = {1, 2, 3};
            int (*p)[3];  // 数组指针p,指向“int[3]”类型的数组
            p = &arr;     // 取整个数组的地址(与arr不同,arr是首元素地址)
            
            // 访问数组元素:通过指针解引用得到数组,再取下标
            printf("%d\n", (*p)[0]);  // 输出1
            return 0;
        }

  


 4. 指针数组(元素为指针的数组)


        本质:是一个数组,其每个元素都是指针变量。重点是 “数组”,数组的元素类型为指针。
        定义格式:元素类型* 数组名[数组长度];(无括号,[]优先级高于*,先形成数组,元素为指针)
        示例:
        #include <stdio.h>

        int main() {
            int a = 1, b = 2, c = 3;
            int* arr[3] = {&a, &b, &c};  // 指针数组:每个元素是int*
            
            // 访问元素:数组元素是指针,解引用得到值
            printf("%d\n", *arr[0]);  // 输出1
            return 0;
        }
        (常见用途:存储字符串地址,如char* strs[] = {"abc", "def"};)


    5. 常量指针(指向常量的指针)


        本质:是一个指针,指向的内容是常量(不可通过指针修改),但指针本身可以指向其他地址。核心:保护指向的内容不被修改。
        定义格式:const 元素类型* 指针变量名; 或 元素类型 const* 指针变量名;(const修饰的是 “指向的内容”)
        示例:
        #include <stdio.h>

        int main() {
            int a = 10;
            const int* p = &a;  // 常量指针p,指向a
            // *p = 20;  // 错误:不能通过p修改指向的内容
            p = NULL;  // 正确:指针本身可以改变指向
            return 0;
        }


    6. 指针常量(指针本身是常量)


        本质:是一个常量,指针的指向不可改变(必须初始化),但指向的内容可以修改。核心:指针的地址是固定的。
        定义格式:元素类型* const 指针变量名 = 初始地址;(const修饰的是 “指针变量本身”,必须初始化)
        示例:
        #include <stdio.h>

        int main() {
            int a = 10, b = 20;
            int* const p = &a;  // 指针常量p,初始化指向a
            *p = 30;  // 正确:可以修改指向的内容(a变为30)
            // p = &b;  // 错误:指针的指向不能改变
            return 0;
        }
    总结:区分关键
    函数指针 vs 指针函数:看核心是 “指针” 还是 “函数”。函数指针是指针(指向函数),指针函数是函数(返回指针)。
    数组指针 vs 指针数组:看[]和*的优先级。(*p)[n]是数组指针(先*后[]),*p[n]是指针数组(先[]后*)。
    常量指针 vs 指针常量:看const修饰谁。const int* p(修饰*p,内容不可改),int* const p(修饰p,指向不可改)。

http://www.dtcms.com/a/511703.html

相关文章:

  • sqoop采集完成后导致hdfs数据与Oracle数据量不符的问题。怎么解决?
  • 洛阳有做网站开发的吗平台网站建设源码
  • 从零开始的C++学习生活 12:AVL树全面解析
  • Spring Boot 启动慢?启动过程深度解析与优化策略
  • telnet工具使用详解
  • YOLOv4:目标检测界的 “集大成者”
  • 从零开始的C++学习生活 11:二叉搜索树全面解析
  • 【QT常用技术讲解】控件随窗口自适应变化大小或者移动位置
  • Kafka面试精讲 Day 30:Kafka面试真题解析与答题技巧
  • 江苏建设准考证打印在哪个网站医疗网站 seo怎么做
  • 数据结构9:队列
  • 逆向分析星星充电APP:从签名生成到数据深度解析
  • Vue + WebApi 实现上传下载功能
  • 建设门户网站预算做旅游网站多少钱
  • 【Rust创作】Rust 错误处理:从 panic 到优雅控制
  • 常见激活函数的Lipschitz连续证明
  • 专做皮具的网站网站建设公司排行榜
  • 第三次面试:C++实习开发
  • 公司网站内容更新该怎么做wordpress显示目录
  • 边界扫描测试原理 2 -- 边界扫描测试设备的构成
  • 如何入侵网站后台晴天影视
  • Linux top 命令使用说明
  • 研发图文档管理的革新:从无序到智能协同
  • springboot点餐系统的设计与实现(代码+数据库+LW)
  • ArcoDesignVue Select组件分离问题
  • Python开发:接口场景设计
  • 汽车网站flash模板定制高端网站建设
  • 【Ubuntu18.04 D435i RGB相机与IMU标定详细版(三)】
  • 单肩包自定义页面设计模板seo关键词优化软件app
  • 朊病毒检测市场:技术突破与公共卫生需求驱动下的全球增长