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博客