指针的进阶(C语言)(上)

目录

 

前言

1、字符指针

2、指针数组

3、数组指针

3.1数组指针的定义

3.2 数组名VS&数组名

3.3数组指针的运用


 

前言

        对于指针,我们已经有了初步认识(可以看我写的指针详解那一篇文章)。

简单总结一下基本概念:

        1、指针就是一个变量,用来存放地址,地址唯一标识一块空间。

        2、指针的大小是4/8个字节(32位平台为4字节,64位平台为8字节)

        3、指针是有类型的,指针的类型决定了指针的+-的步长以及指针解引用操作时候计算机如何看待指针所指向的内容。

        4、指针的运算(指针+-常数;指针-指针;指针与指针的比较)

        对于基本概念了解后,现在我们进行指针进阶,对指针进行进一步的深入分析。

1、字符指针

        举例两种用法:

        第一种,指向字符变量,可以操作字符变量。

#include<stdio.h>
int main()
{
	char ch = "w";
	char* pc = &ch;
	*pc = 'b';
	printf("%c\n", ch);
	return 0;
}

        还有一种,指向字符串。

#include <stdio.h>
int main()
{
	const char* p = "abcdef";
	printf("%s\n", p);
	return 0;
}

        第二种用指针指向字符串,实际上是把字符串首元素的地址传给了指针变量。而对于常量符串来说,其内容不可被更改,因此用const'修饰*p表示*p的无法更改。

        看一个例子:

        218fac19768241da8d321091fb89cb83.png

        原因:对于常量字符串,放在内存的只读数据区里面,这个空间只能读不能写,只能用不能改变其内容,对于同样的常量字符串,会放在同一个地址,因此p1和p2指向同一个地址,因此p1==p2。

        但是对于arr1和arr2来说,它们是被创建的两个数组,自然会在内存中开辟不同的地址,“abcdef”只不过是对其的初始化而已。所以这两个数组的首元素地址是不同的。

2、指针数组

        是数组,是用来存放指针的数组。

int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int arr2[] = { 2,3,4,5,6 };
	int arr3[] = { 3,4,5,6,7 };

	int* parr[3] = { arr1,arr2,arr3 };

	int i = 0;
	int j = 0;
	for (i = 0;i < 3;i++)
	{
		for (j = 0;j < 5;j++)
		{
			printf("%d ", *(parr[i] + j));
		}
		printf("\n");
	}

	return 0;
}

        parr就是一个指针数组,它的内部存放了三个地址。

04590e1c381f466c9d300feb26e6d8fe.png

        对每个地址进行访问,就能打印出所有元素的值。其实对于指针数组来讲,它其实是模拟了一个二维数组。访问时可以直接用parr[i][j];效果完全相同。

3、数组指针

        是指针,是指向数组的指针。

3.1数组指针的定义

        int* p1[10];                       p1是指针数组

        int (*p2)[10];                    p2是数组指针

       p2数组指针可以指向一个数组,该数组有10个元素,每个元素是int类型

        要将明白数组指针,必须要先弄懂数组名的概念。

3.2 数组名VS&数组名

        数组名通常表示的是首元素的地址,但是有两个例外:

        1.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。

        2.&数组名,这里的数组名表示的依然是整个数组,所以&数组名取出的是整个数组的地址

2f229ab0ea2f4384b1e4d59339de58e4.png

        &数组名从值上来看,和数组名是一样的,都表示了数组首元素的地址,但是,他们的区别是什么?我们都加一看看。

  、a9dfb1c97571497d906dc5711c4c7b81.png

        我们发现,arr加1加了4,而&arr加1加了40。由此我们知道,&数组名之后,它会表示整个数组的地址,+1直接跳过整个数组。

        那么想&arr这样的数据,如果我们想用变量去存放它,我们该用什么变量去存放它呢。答案就是数组指针。“数组指针就是指向数组的指针”,这样我们便理解了这句话。

int(*p2)[10] = &arr;

        这样去定义就能存放&arr,不加括号p2会优先和[]结合成为数组,因此需要用括号将*和p2括起来,确保其是一个指针,后面[]中放的数是arr的元素个数。int指的是arr元素的类型。

3.3数组指针的运用

         b7c35cddf7934d7b940973d268528b57.png

        这是一个运用的例子,有几个要注意的点。1、在定义数组指针时,[]中必须指明数组的元素个数。2、在输出时,一定要将*p用()括起来,不然p会优先和[]结合,变成野指针。

        但是我们一般不这么使用,因为用指针访问数组只需要用*p指向arr就好了。

        数组指针不是应用在这种情况的,数组指针一般运用在二维及以上的数组处理。

1aca081dcdf34b2c8a698305a0ffa00c.png

        这个例子告诉我们,当函数传参时二维数组时,形参可以用数组指针去接收。这样去使用数组指针是最舒适的。

 

        到此,指针进阶(上)结束,后面还有一篇进行讲解,还包括的内容有函数传参如何用指针接收、函数指针、函数指针数组、指向函数指针数组的指针、回调函数。

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

探索海洋世界,基于YOLOv5全系列【n/s/m/l/x】参数模型开发构建海洋场景下海洋生物检测识别分析系统

前面的博文中&#xff0c;开发实践过海底相关生物检测识别的项目&#xff0c;对于海洋场景下的海洋生物检测则很少有所涉及&#xff0c;这里本文的主要目的就是想要开发构建基于YOLOv5的海洋场景下的海洋生物检测识别系统。 前文相关的开发实践如下&#xff0c;感兴趣的话可以…

Django实战:部署项目 【资产管理系统】,Django完整项目学习研究(项目全解析,部署教程,非常详细)

导言 关于Django&#xff0c;我已经和大家分享了一些知识&#xff0c;考虑到一些伙伴需要在实际的项目中去理解。所以我上传了一套Django的项目学习源码&#xff0c;已经和本文章进行了绑定。大家可以自行下载学习&#xff0c;考虑到一些伙伴是初学者&#xff0c;几年前&#…

MySQL-DDL-数据库操作

目录 数据库操作查询所有数据库创建数据库使用数据库查询当前数据库删除数据库 数据库操作 DDL 英文全称是 Data Definition Language&#xff0c;数据定义语言&#xff0c;用来定义数据库对象(数据库、表)。 查询所有数据库 show databases;创建数据库 create database [ i…

C++面试宝典第30题:分发饼干

题目 假设你是一位非常棒的家长,想要给你的孩子们分发一些小饼干。但是,每个孩子最多只能给一块饼干。对每一个孩子i,都有一个胃口值gi,这是能让孩子们满足胃口的饼干的最小尺寸。对每一块饼干j,都有一个尺寸sj。如果sj >= gi,我们就可以将这个饼干j分配给孩子i,这个…

【软考】系统集成项目管理工程师(十六)变更管理【1分】

一、 变更的概念 1、定义、原因、分类 2、变更流程 二、 变更的原则 1、变更管理原则、配置管理工具 2、变更管理流程 三、 变更的流程及角色职责 1、提出变更申请、变更影响分析 2、变更测试 1、有些变更很小&#xff0c;客户着急要&#xff0c;可以不用走变更程序直接修改…

【机器学习算法】KNN鸢尾花种类预测案例和特征预处理。全md文档笔记(已分享,附代码)

本系列文章md笔记&#xff08;已分享&#xff09;主要讨论机器学习算法相关知识。机器学习算法文章笔记以算法、案例为驱动的学习&#xff0c;伴随浅显易懂的数学知识&#xff0c;让大家掌握机器学习常见算法原理&#xff0c;应用Scikit-learn实现机器学习算法的应用&#xff0…

NestJS入门1:创建项目

1.初始化 管理员权限运行CMD进入某个文件夹&#xff0c;输入命令&#xff0c;进行初始化&#xff0c;该命令不在文件夹下产生文件 npm i -g nestjs/cli 2. 创建项目 不需要手工创建文件夹&#xff0c;在原路径下执行以下命令&#xff08;其中nest-start为项目名&#xff0c…

传输层协议 TCP协议 知识点

文章目录 传输层定义传输层“端到端”解析传输层端口&#xff1a;Port端口号分类端口实验&#xff08;FTP为例&#xff09; 扩展知识 传输层定义 传输层定义了主机应用程序之间端到端的连通性。 传输层中最为常见的两个协议分别是传输控制协议TCP (Transmission Control Proto…

STL篇四:stack和queue

文章目录 前言1.stack的介绍和模拟实现1.1 stack的介绍1.2 stack的模拟实现 2. Queue的介绍和模拟实现2.1 Queue的介绍2.2 Queue的模拟实现 3.priority_queue的介绍和模拟实现3.1 priority_queue的介绍3.2 priority_queue模拟实现3.3 仿函数 4.容器适配器4.1 什么是容器适配器4…

NestJS入门4:MySQL typeorm 增删改查

前文参考&#xff1a; NestJS入门1 NestJS入门2&#xff1a;创建模块 NestJS入门3&#xff1a;不同请求方式前后端写法 1. 安装数据库相关模块 npm install nestjs/typeorm typeorm mysql -S 2. MySql中创建数据库 ​ 3. 添加连接数据库代码 app.module.ts ​ import { M…

借助Aspose.BarCode条码控件,C# 中的文本转 QR 码生成器

二维码用于在较小的空间内存储大量数据。它们易于使用&#xff0c;可以通过智能手机或其他设备扫描来打开网站、观看视频或访问其他编码信息。在这篇博文中&#xff0c;我们将学习如何使用 C# 以编程方式生成基于文本的 QR 码。我们将提供分步指南和代码片段&#xff0c;帮助您…

【天衍系列 01】深入理解Flink的 FileSource 组件:实现大规模数据文件处理

文章目录 01 基本概念02 工作原理03 数据流实现04 项目实战4.1 项目结构4.2 maven依赖4.3 StreamFormat读取文件数据4.4 BulkFormat读取文件数据4.5 使用小结 05 数据源比较06 总结 01 基本概念 Apache Flink 是一个流式处理框架&#xff0c;被广泛应用于大数据领域的实时数据…

【VSCode】设置 一键生成vue模板 的快捷入口

问题 每次写一个组件的时候&#xff0c;都需要去手敲默认结构或者是复制粘贴&#xff0c;十分的麻烦&#xff01; 解决办法 文件 > 首选项 > 用户代码片段 > vue.json 配置vue模板 其中prefix是用来触发代码段的内容&#xff0c;即模版的快捷入口&#xff1b;body里…

【RT-DETR有效改进】可变形大核注意力 | Deformable-LKA适用于复杂背景或不同光照场景

👑欢迎大家订阅本专栏,一起学习RT-DETR👑 一、本文介绍 本文给大家带来的改进内容是Deformable-LKA(可变形大核注意力)。Deformable-LKA结合了大卷积核的广阔感受野和可变形卷积的灵活性,有效地处理复杂的视觉信息。这一机制通过动态调整卷积核的形状和大小来适…

Java实现Redis延时队列

“如何实现Redis延时队列”这个面试题应该也是比较常见的&#xff0c;解答如下&#xff1a; 使用sortedset&#xff08;有序集合&#xff09; &#xff0c;拿时间戳作为 score &#xff0c;消息内容作为key 调用 zadd 来生产消息&#xff0c;消费者用zrangebyscore 指令获取 N …

【Vuforia+Unity】01实现单张多张图片识别产生对应数字内容

1.官网注册 Home | Engine Developer Portal 2.下载插件SDK&#xff0c;导入Unity 3.官网创建数据库上传图片&#xff0c;官网处理成数据 下载好导入Unity&#xff01; 下载好导入Unity&#xff01; 下载好导入Unity&#xff01; 下载好导入Unity&#xff01; 4.在Unity设…

iconfont的使用(最详解)

目录 一、Iconfont是什么&#xff1f; 二、Iconfont如何使用 1.官网注册 2.新建项目 3.项目中使用 Unicode方式 Font class方式 Symbol方式 三、总结 一、Iconfont是什么&#xff1f; iconfont是阿里旗下的一套图标库&#xff0c;UI设计师设计号图标后&#xff0c;会…

FL Studio21.2注册激活码免费版安装包下载

FL Studio 21的音乐编辑功能强大而全面&#xff0c;能够满足音乐制作人在音乐创作过程中的各种需求。以下是一些主要特点&#xff1a; FL Studio 21 Win-安装包下载如下: https://wm.makeding.com/iclk/?zoneid55981 FL Studio 21 Mac-安装包下载如下: https://wm.makedin…

Java 基于微信小程序的考研论坛系统,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

使用SiteScan合理信息收集

一、介绍 作者&#xff1a;kracer 定位&#xff1a;专注一站式解决渗透测试的信息收集任务。 语言&#xff1a;python3开发 功能&#xff1a;包括域名ip历史解析、nmap常见端口爆破、子域名信息收集、旁站信息收集、whois信息收集、网站架构分析、cms解析、备案号信息收集、…