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

C语言的指针常量、常量指针、指针函数、函数指针的区别

一、指针常量和常量指针的区别

1. 指针常量

指针常量:指针本身是常量,初始化后不能指向其他地址,但可以通过指针指向的地址修改目标值

格式为:

int * const p //指针常量

示例:

int a,b;
int * const p=&a //指针常量
//那么分为一下两种操作
*p=9;//操作成功
p=&b;//操作错误

指针常量: 指针指向的地址不能改变,但地址里面的值可以改变。

2. 常量指针

含义:指针指向的内容是常量,不能通过该指针修改目标值,但指针本身可以指向其他地址

格式:

const int *p = &a; //常量指针

示例:

int a,b;
 const int *p=&a //常量指针
//那么分为一下两种操作
*p=9;//操作错误
p=&b;//操作成功

常量指针: 指针指向的地址可以改变,但地址里面的值不可以改变。 

3.指向常量的常指针

含义:指针指向的地址不能改变,指针指向地址中的值也不能改变

格式:

const int * const b = &a;//指向常量的指针常量

参考:指针常量与常量指针的区别-CSDN博客

【C/C++】 常量指针,指针常量、指向常量的常指针详解-CSDN博客

二 、指针函数和函数的区别

1. 指针函数

定义:指针函数是一个 返回指针的函数,即函数的返回值是一个指针。

格式: 返回类型* 函数名(参数列表)

函数返回一个指针,指向某种类型的数据。

常用于动态内存分配、返回数组或结构体指针等场景。

看看下面这个函数声明:

int fun(int x,int y);

这种函数应该都很熟悉,其实就是一个函数,然后返回值是一个 int 类型,是一个数值。
接着看下面这个函数声明:

int *fun(int x,int y);

这和上面那个函数唯一的区别就是在函数名前面多了一个*号,而这个函数就是一个指针函数。其返回值是一个 int 类型的指针,是一个地址。

这样描述应该很容易理解了,所谓的指针函数也没什么特别的,和普通函数对比不过就是其返回了一个指针(即地址值)而已。

 代码实例(返回数组):

#include <stdio.h>
#include <stdlib.h>

// 指针函数:返回动态分配的数组
int* createArray(int size) {
    int* arr = (int*)malloc(size * sizeof(int));
    for (int i = 0; i < size; i++) {
        arr[i] = i + 1;
    }
    return arr;  // 返回指针
}

int main() {
    int* arr = createArray(5);  // 调用指针函数
    for (int i = 0; i < 5; i++) {
        printf("%d ", arr[i]);  // 输出:1 2 3 4 5
    }
    free(arr);  // 释放内存
    return 0;
}

 示例代码(返回结构体):

#include <stdio.h>

typedef struct {
    int a;
    int b;
} Stu;

Stu getStu(int x, int y) {
    Stu result;
    result.a = x;
    result.b = y;
    return result;
}

int main() {
    Stu test = getStu(2, 3);
    printf("%d %d\n", test.a, test.b);
    return 0;
}

2. 函数指针

定义:函数指针是一个 指向函数的指针,即指针变量存储的是函数的地址。

语法返回类型 (*指针名)(参数列表)

int (*fun)(int x,int y);

函数指针是需要把一个函数的地址赋值给它,有两种写法:

fun = &Function;
fun = Function;

可以动态调用不同的函数。

常用于回调函数、函数表、策略模式等场景。

示例:

#include <stdio.h>

// 定义两个函数
int add(int a, int b) {
    return a + b;
}

int subtract(int a, int b) {
    return a - b;
}

// 定义函数指针
int (*funcPtr)(int, int);

int main() {
    
    // 指向 add 函数
    funcPtr = &add;
    printf("Add: %d\n", funcPtr(5, 3));  // 输出:8

    // 指向 subtract 函数
    funcPtr = subtract;
    printf("Subtract: %d\n", funcPtr(5, 3));  // 输出:2

    return 0;
}

二者区别
通过以上的介绍,应该都能清楚的理解其二者的定义。那么简单的总结下二者的区别:

定义不同
指针函数本质是一个函数,其返回值为指针。
函数指针本质是一个指针,其指向一个函数。

写法不同
指针函数:int* fun(int x,int y);
函数指针:int (*fun)(int x,int y);
可以简单粗暴的理解为,指针函数的*是属于数据类型的,而函数指针的星号是属于函数名的。
再简单一点,可以这样辨别两者:函数名带括号的就是函数指针,否则就是指针函数。

参考:函数指针和指针函数用法和区别-CSDN博客

相关文章:

  • 去中心化协作智能生态系统设计
  • 【Flink实战】Flink网络内存和托管内存
  • 可视化工具SciChart如何结合Deepseek快速创建一个React仪表板?
  • CT dicom 去除床板 去除床位,检查床去除
  • Java Web开发实战与项目——Spring Boot与Redis实现缓存管理
  • Unitree Project
  • 深度学习-119-Text2SQL之实现的三种技术途径
  • C语言程序实现shell命令的重定向符号功能
  • D-FINE模型详解及代码复现
  • 酒店旅游API:数据交互的隐形桥梁——以携程API为例
  • Jenkins 视图(View)
  • 蓝桥杯15 填空题
  • TensorFlow v2.16 Overview
  • JDK源码系列(一)Object
  • Kubernetes控制平面组件:APIServer 基于 引导Token 的认证机制
  • C#上位机--选择语句(switch)
  • Typora软件(Markdown编辑器)详细安装教程(附补丁包)2025最详细图文教程安装手册
  • 打开Firefox自动打开hao360.hjttif.com标签解决方案
  • Resource not found: roslaunchROS path [0]=/opt/ros/noetic/share/ros
  • DeepSeek模型量化
  • 贵州茅台:支持工作餐不上酒的规定,请投资者相信茅台创新和自我调节能力
  • 世卫大会连续九年拒绝涉台提案
  • 上海肺科医院院长陈昶:临床中的痛点,正是新技术诞生的起点
  • 世卫大会中国代表团:中国深入参与全球卫生治理,为构建人类卫生健康共同体贡献中国力量
  • 福建、广西等地有大暴雨,国家防总启动防汛四级应急响应
  • 纽约市长称墨西哥海军帆船撞桥事故已致2人死亡