C 深入指针(4)

目录

一、字符指针变量

1 初始化

2 与字符串数组的区别

二、数组指针变量 

1 初始化

2 二维数组传参本质

三、函数指针变量

1 初始化

2 用法 

四、typedef关键字

五、函数指针数组


一、字符指针变量

1 初始化

//VS2022 x64
#include <stdio.h>
int main()
{char* p = 'w';	//字符指针变量char* pc = "abcdef";	//pc 里存放的是字符串首元素的地址printf("%s", pc);	//输出 abcdefreturn 0;
}

2 与字符串数组的区别

#include <stdio.h>
int main()
{char arr1[] = "abcd";char arr2[] = "abcd";char* pc1 = "abcd";char* pc2 = "abcd";if (arr1 == arr2)    //判断存储的地址是否一样printf("arr1 和 arr2 一样\n");elseprintf("arr1 和 arr2 不一样\n");if(pc1 == pc2)    //判断存储的地址是否一样printf("pc1 和 pc2 一样\n");elseprintf("pc1 和 pc2 不一样\n");return 0;
}//输出
//arr1 和 arr2 不一样
//pc1 和 pc2 一样

 


二、数组指针变量 

1 初始化

#include <stdio.h>
int	main()
{//类比一下//整型指针变量int a = 10;int* p1 = &a;	//指针类型:int*int arr[5] = { 0,1,2,3,4 };//整型指针变量int* p = arr;	//指针类型:int* 指向数组首元素地址//数组指针变量int(*p)[5] = &arr;	//指针类型:int(*)[5] 指向整个数组地址return 0;
}

2 二维数组传参本质

原来的格式

#include <stdio.h>
void func(int arr[3][3])
{for (int i = 0; i < 3; i++){for (int j = 0; j < 3; j++){printf("%d ", arr[i][j]);}printf("\n");}
}int main()
{int arr[3][3] = { {1,2,3},{2,3,4},{3,4,5} };func(arr);	//传的是数组首元素地址return 0;
}

根据数组名是数组首元素的地址这个规则,二维数组的数组名表示的就是第一行的地址,是一维数组的地址。根据上面的例子,第一行的一维数组的类型就是 int[3] ,所以第一行的地址的类型就是数组指针类型 int(*)[3] 。那就意味着二维数组传参本质上也是传递了地址,传递的是第一行这个一维数组的地址,那么形参也是可以写成指针形式的。 

void func(int (*p)[3])
{for (int i = 0; i < 3; i++){for (int j = 0; j < 3; j++){printf("%d ", p[i][j]);	//等同于*( *(p + i) + j)}printf("\n");}
}int main()
{int arr[3][3] = { {1,2,3},{2,3,4},{3,4,5} };func(arr);return 0;
}

三、函数指针变量

1 初始化

函数是有地址的,函数名就是函数的地址,当然也可以通过 &函数名 的方式获得函数的地址。

#include <stdio.h>
int Add(int a,int b)
{return a + b;
}int main()
{int a = 0;int b = 0;Add(a,b);int (*p1)(int, int) = &Add;int (*p2)(int,int) = Add;printf("%p\n", p1);printf("%p\n", p2);return 0;
}//输出
//00007FF6EA2413CA
//00007FF6EA2413CA

2 用法 

通过函数指针调用指针指向的函数

#include <stdio.h>
int Add(int a, int b)
{return a + b;
}int main()
{int a = 5;int b = 5;int (*p1)(int, int) = Add;printf("%d\n", p1(a, b));    //等同于Add(a, b)return 0;
}//输出
//10

四、typedef关键字

typedef 是用来类型重命名的,可以将复杂的类型,简单化

//将 unsigned int 重命名为 uint
typedef unsigned int uint;

但是对于数组指针和函数指针稍微有点区别:新的类型名必须在 * 的右边

//将 int(*)[5] 重命名为 pa_int
typedef int(*pa_int)[5];
//将 int(*)(int, int) 重命名为pf_int
typedef int(*pf_int)(int, int);

五、函数指针数组

存放指针的数组称为指针数组,存放函数指针的数组称为函数指针数组

int(*pf[3])(int, int);

pf 先和 [ ] 结合,说明 pf 是数组,数组的内容是 int (*)(int, int) 类型的函数指针。


完 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/707276.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

InnoDB 事务处理机制

文章目录 前言1. 事务处理挑战1.1 事务机制处理的问题1.2 并发事务带来的问题 2. InnodDB 和 ACID 模型2.1 Innodb Buffer Pool2.2 Redo log2.3 Undo log2.4 应用案例 3. 隔离级别和锁机制3.1 事务隔离级别3.1.1 READ UNCOMMITTED3.1.2 READ COMMITTED3.1.3 REPEATABLE READ3.1…

Linux下redis源码编译安装

华子目录 Redis介绍什么是RedisRedis能干什么Redis的特点Redis与memcached对比 redis源码编译安装下载源码包准备安装环境开始编译开始安装 前台启动后台启动redis开启systemctl启动redis测试redis相关知识 Redis介绍 什么是Redis 2008年&#xff0c;意大利的一家创业公司Mer…

xlrd.biffh.XLRDError: Excel xlsx file; not supported报错原因

xlrd库读取xlsx文件时报错 xlrd.biffh.XLRDError: Excel xlsx file; not supported报错原因&#xff1a; xlrd版本为2.1版本&#xff0c;需要读取xlsx文件需要安装xlrd低一些版本1.2.0版本&#xff0c;重新安装重试即可 更换xlrd版本 重新运行

数仓架构之为什么要进行数仓分层

数仓分层这个概念想必大家都很熟悉&#xff0c;不管是在实际的开发工作当中会用的&#xff0c;还是在面试官面试你的时候会问到&#xff1a;你之前的项目是按照什么分层的&#xff0c;分哪几层&#xff0c;数仓分层有什么好处&#xff0c;举个栗子说说。 简而言之&#xff0c;…

element-ui dialog form 弹框表单组件封装

在使用 element-ui 进行后端管理系统开发时&#xff0c;在封装弹框表单时&#xff0c;遇到两个问题&#xff0c;这里进行简单记录&#xff1a; 1、问题一&#xff1a;点击关闭按钮及遮罩层关闭弹框时&#xff0c;页面报错&#xff0c;如下&#xff1a; 子组件封装&#xff1a;…

上海初中生古诗文大会倒计时4个月:单选题真题示例和独家解析

现在距离2024年初中生古诗文大会还有4个多月时间&#xff0c;备考要趁早&#xff0c;因为知识点还是相对比较多的。这些知识点对于初中语文的学习也是很有帮助的。 今天我们继续来看10道选择题真题和详细解析&#xff0c;以下题目截取自我独家制作的在线真题集&#xff0c;都是…

普通人也能创业!轻资产短视频带货项目,引领普通人实现创业梦想

在这个信息爆炸的时代&#xff0c;创业似乎成为了越来越多人的梦想。然而&#xff0c;传统的创业模式 keJ0277 往往伴随着高昂的资金投入和复杂的管理流程&#xff0c;让许多普通人望而却步。然而&#xff0c;现在有一种轻资产短视频带货项目正在悄然兴起&#xff0c;它以其低…

【CSND博客纪念】“创作纪念日:从灵感迸发到小有成就——我的CSND博客创作之旅”

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…

Verilog 实现 i2c 协议

在时钟&#xff08;SCL&#xff09;为高电平的时候&#xff0c;数据总线&#xff08;SDA&#xff09;必须保持稳定&#xff0c;所以数据总线&#xff08;SDA&#xff09;在时钟&#xff08;SCL&#xff09;为低电平的时候才能改变。 在时钟&#xff08;SCL&#xff09;为高电平…

【c语言】TIMI哥听课笔记

计算机的组成 主储存器&#xff1a;内存条&#xff0c;硬盘 CPU内部&#xff1a;运算器&#xff0c;控制器&#xff0c;寄存器 进制转化&#xff1a;二转八拆三&#xff0c;二转十六拆四 基本数据类型 常量&#xff1a;整型常量&#xff08;十进制&#xff0c;0x十六&#x…

【Altium】AD-检查原理图中元器件未连接的Passive Pin

1、 文档目标 如何让原理图编译时找出元器件上未连接的Passive Pin 2、 问题场景 当引脚属性&#xff08;Pin type&#xff09;为passive时&#xff0c;原理图编译的默认规则是不会去检查它们是否有连接的。在实际设计过程中&#xff0c;经常会有导线虚连&#xff0c;漏连的事…

24长三角B题1-5问完整代码+15页保姆级思路已更新

比赛题目的完整版思路可执行代码数据参考论文都会在第一时间更新上传的&#xff0c;大家可以参考我往期的资料&#xff0c;所有的资料数据以及到最后更新的参考论文都是一次付费后续免费的。注意&#xff1a;&#xff08;建议先下单占坑&#xff0c;因为随着后续我们更新资料数…