[学习笔记]C语言中关于指针的详解2

发布于:2022-11-13 ⋅ 阅读:(711) ⋅ 点赞:(0)

指针函数

指针函数的概念:
本质上是一个函数,返回值类型是指针

char * func(){      //返回值类型是指针
    char *str = "hello";
    return str;   //返回了一个字符串指针
}       

注意 若返回值是在函数内部定义的变量则需要加static

char * func(){
    // 函数内定义的变量存储在栈区 栈区开辟的空间在当前代码段结束后即释放
    char str[100] = "hello";
    // 加static 存储在静态全局区 保留存储的内容
    static char str[100] = "hello";
    return str;
}

函数指针

函数指针的概念:
本质上是一个指针,保存的是函数的地址
我们定义的函数在程序运行时,会将指令加载到内存,所以函数也有地址
c语言中规定:函数名就是函数的首地址,即函数的入口地址,即可以用一个指针变量存储
这个指针变量,就是函数指针
函数指针的定义方法:
返回值类型(*变量名)(形参列表)

int (*p)(int,int);
// 定义了一个int返回值类型,变量名为p的函数指针
// 指向的函数必须有有两个int型参 返回值类型必须为int

调用函数指针时可以和调用普通函数一样 不需要加*

函数指针数组

函数指针数组的概念:
本质是一个数组,存储的每一个元素都是函数指针
函数指针数组的定义方式:
返回值类型(*变量名)(形参列表)

int (*p[10])(int,int);
// 定义了一个数组名为p的函数指针数组 
//其中每个元素都是int返回值类型,有两个int形参的函数指针

函数指针最常用的地方就是将一个函数作为参数传递给另一个函数的时候需要使用函数指针
一个函数作为参数传递给另一个函数 这个函数称之为回调函数
如下,定义加减乘除四个函数,用函数指针调用

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

int sub(int a,int b){
    return a-b;
}
int mux(int a,int b){
    return a*b;
}
int dive(int a,int b){
    return a/b;
}
int process(int (*p)(int,int),int a,int b){
    return p(a,b);
}
int main() {
    int num;
    num = process(add,10,5);
    printf("add = %d\n",num);
    num = process(sub,10,5);
    printf("sub = %d\n",num);
    num = process(mux,10,5);
    printf("mux = %d\n",num);
    num = process(dive,10,5);
    printf("dive = %d\n",num);

}
输出结果:
	add = 15
	sub = 5
	mux = 50
	dive = 2

容易混淆的指针


 int *a[10];
这是个指针数组 数组中有10int类型的指针变量
int (*a)[10];
这是个数组指针 是个地址 占4个字节
int **p;
这是个指针的指针 保存指针变量的地址
int *f(void);
声明了一个指针函数 返回值类型为 int *
int (*f)(void);
这是一个函数指针变量 返回值类型是int 没有参数

特殊指针

空类型指针: void*
任何类型的指针都可以赋值给空类型指针变量
空类型指针在32位系统下 也占4个字节

空指针 : NULL
char *p=NULL;
p指向0x00 00 00 00这个地址 用来给指针初始化

main函数传参

int main(int argc,char *argv[])
argc:  表示从命令行终端输入的参数的个数
argv:  一个指针数组,保存命令行中每一个输入的参数

还没学到结构体,后续把结构体指针补上,然后两个文章整合到一起,上一篇c语言指针详解可点击跳转[学习笔记]C语言中关于指针的详解1
出门遛弯了 see you tomorrow~
在这里插入图片描述

本文含有隐藏内容,请 开通VIP 后查看