09_指针提高

指针提高

二维数组详解

image-20230720185011177

int arr[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
arr ===> 二维数组第0行地址 ===> arr[0]
arr+1 ===> 二维数组第一行地址 ===> arr[1]
*(arr) ===> 第0行第0列地址 ===> arr[0][0]
*(arr+1)+1 ===> 第1行第1列地址 ===> arr[1][1]
arr[0] ===> *(arr+0) ===> 第0行地址的值 ===> 第0行第0列地址
&arr[0] ===> &*(arr+0) ===> 第0行地址的值的地址 ===> 第0行地址
**arr ===> arr[0][0]值

image-20230721165312994

image-20230721175022740

指针变量做函数参数

如果想在函数内部修改外部变量的值 需要将外部变量的地址传入函数

image-20230721180922907

数组名作为函数参数

数组作为函数的形参,会被编译器优化为指针变量

int arr[] = {10, 20, 30, 40};
printf("%d\n", sizeof(arr)); //16
fun (arr);
void fun(int arr[]){ //int arr[] ===> int *p
    printf("%d\n", sizeof(arr)); //8
}

函数的返回值类型为指针类型

将函数内部局部变量通过返回值返回给外部使用

image-20230722214546871

函数的内部局部变量运行完后释放掉了,所以会报段错误,解决办法是加static关键字

image-20230722214807753

p *p &p 区别

image-20230723153242695

p: 一个指针变量的名字,表示此指针变量指向内容的地址

*p: 表示此指针变量指向内容的地址的内容

&P: 指针变量自身的地址

使用双重指针修改变量值

image-20230723155343139

函数指针

函数名 代表函数的入口地址

函数指针: 本质是一个指针变量 只是该变量保存的是函数的入口地址

image-20230723160745501

函数指针变量注意:

​ 函数指针变量不要+1 无意义

​ 不要对函数指针变量取* 无意义

typedef 取别名

typedef int (* FUN_TYPE)(int x, int y); //函数指针类型
FUN_TYPE p = my_add;

由地址找到函数

image-20230723162324539

函数指针 作为函数的参数

my_calc完成加减乘除

int add(int x, int y)
{
    return x + y;
}

int sub(int x, int y)
{
    return x + y;
}

int mul(int x, int y)
{
    return x + y;
}

int div(int x, int y)
{
    return x + y;
}

//设计算法,完成加减乘除
int my_calc(int d1, int d2, int (* func)(int, int))
{
    return func(d1, d2);
}

int main(int argc, char const *argv[])
{
    printf("%d\n", my_calc(1 ,2 ,add));
    return 0;
}
posted @   爱吃冰激凌的黄某某  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示