【C语言】善于利用指针(二)
💗个人主页💗
⭐个人专栏——C语言初步学习⭐
💫点击关注🤩一起学习C语言💯💫
目录
- 导读:
- 1. 字符指针
- 1.1 字符串的引用方式
- 1.2 有趣的面试题
- 2. 数组指针
- 2.1 一维数组指针的定义
- 2.2 一维数组指针的使用
- 2.3 二维数组指针的地址
- 2.4 二维数组指针的使用
导读:
前面我们学习了善于利用指针一,主要讲解了指针的定义、基本用法和一些简单的运算使用,算是指针的初步学习了。
今天我们来学习指针的进阶。
后面还有第三部分的讲解,点击关注,掌握第一信息
1. 字符指针
在前面学习指针的类型中,我们知道有一种指针类型为字符指针char*
一般使用:
int main()
{char ch = 'w';char* pc = &ch;*pc = 'w';return 0;
}
1.1 字符串的引用方式
在C程序中,字符串是存放在字符数组中的。我们可以用字符指针变量指向一个字符串常量,通过字符指针变量引用字符串常量。
int main()
{char* pstr = "I love China!";//这里是把一个字符串放到pstr指针变量里了吗?printf("%s\n", pstr);return 0;
}
特别容易让同学以为是把字符串 I love China! 放到字符指针pstr 里了,但是本质是把字符串 I love China! 首字符的地址放到了pstr中。
注意:
char * pstr = "I love China!";
等价于
char * pstr;//定义一个char*型变量
pstr = "I love China!";
//把字符串第一个元素的地址赋给字符指针变量pstr
1.2 有趣的面试题
int main()
{char str1[] = "hello world.";char str2[] = "hello world.";const char* str3 = "hello world.";const char* str4 = "hello world.";if (str1 == str2)printf("str1 and str2 are same\n");elseprintf("str1 and str2 are not same\n");if (str3 == str4)printf("str3 and str4 are same\n");elseprintf("str3 and str4 are not same\n");return 0;
}
我们来看输出结果并思考是为什么
我们进入调试看一下:
- 这里str3和str4指向的是一个同一个常量字符串。
- C/C++会把常量字符串存储到单独的一个内存区域。
- 当几个指针指向同一个字符串的时候,他们实际会指向同一块内存。
- 但是用相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块。
- 所以str1和str2不同,str3和str4不同。
2. 数组指针
我们在之前提到了数组指针,今天我们再进一步的了解数组指针的使用
2.1 一维数组指针的定义
数组指针:能够指向数组的指针。
数组指针的定义方式与指针的定义方式类似,只不过需要在变量名字之前添加一个数组类型的修饰符。
int *p1[10];//一维数组指针int (*p2)[10];//二维数组指针
p2先和*结合,说明p2是一个指针变量,然后指向的是一个大小为10个整型的数组。所以p2是一个指针,指向一个数组,叫数组指针。
这里要注意:[]的优先级要高于 * 号的,所以必须加上()来保证p先和结合。
2.2 一维数组指针的使用
- 可以通过数组指针进行数组的遍历和修改。
int main()
{int arr[5] = { 1, 2, 3, 4, 5 };int(*ptr)[5] = &arr;for (int i = 0; i < 5; i++) {(*ptr)[i] *= 2;}printf("%d\n",arr[2]);// 输出6,数组第三个元素已经被修改为原来的两倍
}
- 通过数组指针数组的传递和返回。
void print_arr(int(*ptr)[5], int len)
{for (int i = 0; i < len; i++) {printf("%d ", (*ptr)[i]);}
}
int main()
{int arr[5] = { 1, 2, 3, 4, 5 };int(*ptr)[5] = &arr;print_arr(ptr, 5); // 输出1 2 3 4 5return 0;
}
2.3 二维数组指针的地址
假设二维数组的起始地址为2000,一个整型占4个字节,arr+1的值应该是2000+4x4=2016,arr+2的值为2032
表示形式 | 含义 | 值 |
---|---|---|
arr | 二维数组名,指向一维数组arr[0],即0行起始地址 | 2000 |
*(arr+0) arr[0],*arr | 0行0列元素地址 | 2000 |
arr+1,&arr[1] | 1行起始地址 | 2016 |
arr[1],*(arr+1) | 1行0列元素arr[1][0]的地址 | 2016 |
*(arr+1)+2,&arr[1][2],arr[1]+2, | 1行2列元素arr[1][2]的地址 | 2024 |
* ( arr[1]+2), * ( *(arr+1)+2), arr[1][2] | 1行2列元素arr[1][2]的值 | 是元素值,为7 |
2.4 二维数组指针的使用
传递数组指针给函数:
void print_arr(int (*p)[4], int row)
{for (int i = 0; i < row; i++) {for (int j = 0; j < 4; j++) {printf("%d ", *(*(p+i)+j));}printf("\n");}
}int main()
{int arr[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};print_arr(arr, 3); // 传递数组指针arr给函数print_arrreturn 0;
}
相关文章:

【C语言】善于利用指针(二)
💗个人主页💗 ⭐个人专栏——C语言初步学习⭐ 💫点击关注🤩一起学习C语言💯💫 目录 导读:1. 字符指针1.1 字符串的引用方式1.2 有趣的面试题 2. 数组指针2.1 一维数组指针的定义2.2 一维数组…...
Python调用C++
https://www.cnblogs.com/renfanzi/p/10276997.html Linux使用Python调用C/C接口(一) - 代码先锋网 linux系统上使用Python调用C生成的.so动态链接库opencv_linux 下python 编译为so ,给c使用_比赛学习者的博客-CSDN博客 https://www.cnblogs.com/shuimuqingyang/p/13618105…...

自己实现扫描全盘文件的函数。
1.自己实现扫描全盘的函数 def scan_disk(dir): global count,dir_count if os.path.isdir(dir): files os.listdir(dir) for file in files: print(file) dir_count 1 if os.path.isdir(dir os.sep file): …...
JSON文件读写
1、依赖文件 #include <QFile> #include <QJsonDocument> #include <QJsonObject> #include <QDebug> #include <QStringList>2、头文件 bool ReadJsonFile(const QString& filePath""); bool WriteJsonFile(const QString&…...

VisualStudio2022环境下Release模式编译dll无法使用TLS函数问题
Debug x86环境下正常使用TLS回调函数 切换到Release发现程序没有使用tls 到C/C > 优化中将全程序优化关闭即可...

ChatGPT基础使用总结
文章目录 一、ChatGPT基础概念大型语言模型LLMs---一种能够以类似人类语言的方式“说话”的软件ChatGPT定义---OpenAI 研发的一款聊天机器人程序(2022年GPT-3.5,属于大型语言模型)ChatGPT4.0---OpenAI推出了GPT系列的最新模型ChatGPT典型使用…...

解决报错: require is not defined in ES module scope
用node启动mjs文件报错:require is not defined in ES module scope 现象如下: 原因: 文件后缀是mjs, 被识别为es模块,但是node默认是commonjs格式,不支持也不能识别es模块。 解决办法:把文件后缀从.mjs改…...

STM32 10个工程篇:1.IAP远程升级(六)
在IAP远程升级的最后一篇博客里,笔者想概括性地梳理总结IAP程序设计中值得注意的问题,诚然市面上或者工作后存在不同版本的IAP下位机和上位机软件,也存在不同定义的报文格式,甚至对于相似的知识点不同教程又有着完全不同的解读&am…...

【智能家居项目】裸机版本——字体子系统 | 显示子系统
🐱作者:一只大喵咪1201 🐱专栏:《智能家居项目》 🔥格言:你只管努力,剩下的交给时间! 今天实现上图整个项目系统中的字体子系统和显示子系统。 目录 🀄设计思路…...
PDF中跳转到参考文献后,如何回到原文
在PDF中,点击了参考文献的超链接可以直接跳至参考文献的位置。 如果想从当前参考文献在回到正文中对应位置时,可以通过 Alt \red{\text{Alt}} Alt ← \red{\leftarrow} ← 实现。...

了解基于Elasticsearch 的站内搜索,及其替代方案
对于一家公司而言,数据量越来越多,如果快速去查找这些信息是一个很难的问题,在计算机领域有一个专门的领域IR(Information Retrival)研究如何获取信息,做信息检索。在国内的如百度这样的搜索引擎也属于这个…...

【多模态融合】TransFusion学习笔记(2)
接上篇【多模态融合】TransFusion学习笔记(1)。 从TransFusion-L到TransFusion ok,终于可以给出论文中那个完整的框架图了,我第一眼看到这个图有几个疑问: Q:Image Guidance这条虚线引出的Query Initialization是什么意思? Q:图像分支中的…...

Pyhon-每日一练(1)
🌈write in front🌈 🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如…...

MySQL:数据库的物理备份和恢复-冷备份(3)
介绍 物理备份: 直接复制数据文件进行的备份 优点:不需要其他的工具,直接复制就好,恢复直接复制备份文件即可 缺点:与存储引擎有关,跨平台能力较弱 逻辑备份: 从数据库中导出数据另存而进行的备…...
功能比较:Redisson vs Jedis
Redis最流行的两个Java客户端库是Redisson和Jedis。Redisson提供内存中的数据网格功能,支持Redis的各种分布式对象和服务。另一方面,Jedis是一个更轻量级的产品,它缺乏其他库的某些功能。 如果你正在为Redis寻找一个Java客户端库…...

Spring web security
儅使用spring的web security時,默認會轉向自帶的spring security example page。而不會轉向error page。 TODO: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId> &l…...

SpringCloud(二)Docker、Spring AMQP、ElasticSearch
文章目录 DockerDocker与虚拟机Docker架构镜像、容器、镜像托管平台Docker架构Docker实践 Spring AMQP简单使用案例工作队列- WorkQueue发布订阅服务FanoutExchangeDirectExchangeTopicExchange 消息转换器 ElasticSearch倒排索引IK分词器IK分词拓展与停用字典 操作索引库mappi…...

7.Tensors For Beginneers - Convector Components
介绍协向量时,曾说过它们有点像 行向量, 行向量确实以某种方式代表了协向量, 这里说明一下: 协向量是不变的; 协向量组件是可变的。 协向量不依赖坐标系,协向量的组件取决于坐标系。 当我们说协向量具有组…...

直线导轨坏了可以维修吗?
直线导轨是工业自动化设备中常用的零部件,其性能和使用寿命对设备的稳定运行和产能有着直接的影响,在生产中,由于各种原因,直线导轨会出现各种问题,那么,直线导轨的维修方法究竟是怎样的呢?我们…...

Java基础--泛型详解
一、背景 java推出泛型之前,集合元素类型可以是object类型,能够存储任意的数据类型对象,但是在使用过程中,如果不知道集合里面的各个元素的类型,在进行类型转换的时候就很容易引发ClassCastException异常。 二、概念 …...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...

跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...

【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...