指针进阶1

news2024/11/19 5:37:04

目录

本章将学习

1字符指针

2数组指针与指针数组

3数组传参与指针传参


复习指针初阶基本知识点

        1指针是个地址(编号),指针变量是存放指针的变量,但是我们平常所说的指针就是指的指针变量,指针变量的大小有4(32位平台)/8个(64位平台)字节,产生这样大小的原因是,32位平台有32根物理地址线,即一个地址是由32个0/1所组成的二进制序列所组成的,指针的不同类型决定指针加减整数时所决定的步长,还有指针解引用时访问的权限。

 1:字符指针(char*)

字符指针即指向字符的地址

char ch ='w';
char* pch =&ch;
这里的pch就是字符指针

其实还有字符指针可以指向字符数组的->

char str[]="abcdef";
char* pstr =str;//这里的str是数组名,而数组名则是首元素的地址。
所以我们*pstr则打印出来的结果为a
还有另外一种
char* pp="abcdef";//这里我们应该将"abcdef"理解成常量字符串,是不能够改变的,所以pp的规范写法为
const char* pp ="abcdef";
那么我们如何来理解这个代码呢?
其实在我们内存中有一块区域叫做代码区,我们常量字符串就是存放在这个区域内的,pp就是指向这个常量字符串的地址的

接下来我们就看上面两种字符指针的区别

首先第一个字符指针是指向数组的首元素,而第二个指针是在代码区指向常量字符串的。

所以我们可以有以下的一个经典题目:

int main()
{
 char str1[] = "hello bit.";
 char str2[] = "hello bit.";
 const char *str3 = "hello bit.";
 const char *str4 = "hello bit.";
 
 if(str1 ==str2)
 printf("str1 and str2 are same\n");
 else

 printf("str1 and str2 are not same\n");
 
 if(str3 ==str4)
 printf("str3 and str4 are same\n");
 else

 printf("str3 and str4 are not same\n");
 
 return 0;
}

首先数组名都是首元素的地址

因为str1与str2是指向数组的首元素的地址的,而他们在开辟空间的时候需要分开开辟的,所以两个数组的地址是不同的,所以str1与str2are not same

str3与str4是常量字符串指针,它们都会指向代码区的字符串的地址,所以它们是相同的。

2数组指针与指针数组

首先我们需要知道数组指针与指针数组他们的本质,我们先从一个生活中的案例来描述,比如说  好孩子,这里好孩子的本质是孩子,所以数组指针的本质是指针,指针数组的本质是数组。

数组指针:是一个指针,指向数组的指针。

指针数组:是一个数组,里面存储的元素是指针类型的。

那么如何区分他们呢?

首先为了能够区分它们我们需要知道,其实[]的运算符优先级比*要高,所以一种简单的识别方式就是看在*与[]同时出现的时候我们看*是否有()来约束,如果有则一般代表是一个指针,没有则代表是一个数组。接下来通过几个代码来判断是否为指针数组与数组指针。

int* arr1[10]; //整形指针的数组

char *arr2[4]; //一级字符指针的数组

char **arr3[5];//二级字符指针的数组
//这几个都是指针数组,在*前面未加()
int *p1[10];

int (*p2)[10];

//p1, p2分别是什么?
p1:p1是一个数组,数组中有10个元素,每个元素的类型是int*
p2:p2是一个指针,它所指向的类型是int [10]的数组,数组中有10个元素,每个元素是int类型的
本质上p1是指针数组,p2是数组指针

&数组名与数组名的区别

首先我们曾今就知道除了2中情况下数组名就是代表数组首元素的地址,所以数组名本质上就是一个地址,即数组名本质上是一个指针。

2中情况下就有   &数组名与sizeof(数组名)在这两种情况下都是指的是整个数组

而&数组名则代表的是取出该数组的整个地址,但是我们一般还是用首元素的地址来代表这个&数组名的值,而不同的则是&数组名在加减整数时候是跳过整个数组的地址

3数组传参与指针传参

       一维数组的传参

        当我们使用一维数组传参的时候,我们可以用什么类型来接收呢?

        

二维数组的传参的时候,当使用数组的时候需要注意数组的列是不能够省略的,二位数组传参的时候是传的一位数组的地址,所以我们可以用数组指针来接收 

指针传参

        当我们使用指针传参的时候我们也可以用指针来接受指针。

一 个 函 数 的 参 数 部 分 为 一 级 指 针 的 时 候 , 函 数 能 接 收 什 么 参 数 ?

        数组名,传一级指针。

二级指针

        我们可以传一级指针的地址,也可以传二级指针

        反正无论怎么样,我们都需要具体问题具体分析,看传的是啥,则我们用啥接受。

        

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决Quixel Bridge导出到Blender3.1失败port 28888

文章目录 前言一、错误情景二、解决办法总结 前言 解决Quixel Bridge导出到Blender3.1报错无法经由端口28888导出. 一、错误情景 导出插件显示已安装完成: 但是点击右下角导出报错无法从端口28888执行该操作. 我尝试过把MSPlugin插件手动安装到Blender3.1但这并不奏效. 二、解…

聚观早报|Threads上线7小时注册破千万;兰博基将终结燃油车生产

今日要闻:Threads上线7小时注册破千万;兰博基尼宣布将终结燃油车生产;腾讯旗下企鹅FM9月6日正式停止运营;ChatGPT暂停接入必应搜索功能;首个国产GLP-1“减肥药”获批 Threads上线7小时注册破千万 7 月 6 日消息&#…

Windows 基本概念和术语

Windows 基本概念和术语 Windows APIWindows API 的风格Windows 运行时.NET Framework 服务、函数和例程进程使用任务管理器查看进程信息父进程 线程纤程用户模式调度线程 作业虚拟内存内核模式和用户模式虚拟机监控程序固件终端服务和多会话对象和句柄安全性注册表Unicode总结…

google软件测试之道

目录 前言: 一、Google软件测试介绍 1)质量不等于测试 2)角色、职责 3)组织结构 4)测试版本 5)测试类型: 二、软件测试开发工程师,SET 1)SET的工作 2&#xff…

JVM 三色标记算法

我们要进行垃圾回收,就需要弄明白哪些对象是需要回收的,哪些对象是不需要回收的。针对这个问题,其实业界已经有几种常见的解决方法了。 第一种是计数法 第一种是计数法,就是每个对象都有一个计数器,被引用了加一&…

4.2 x64dbg 针对PE文件的扫描

通过运用LyScript插件并配合pefile模块,即可实现对特定PE文件的扫描功能,例如载入PE程序到内存,验证PE启用的保护方式,计算PE节区内存特征,文件FOA与内存VA转换等功能的实现,首先简单介绍一下pefile模块。 …

uuid-golang中的使用---借鉴使用官网的办法--推荐

写在最前面的话,golang因为是国外开发的,官网,github都是网速卡或者不能使用的,这个时候可以使用国内的,搜索软件包或者下载 https://gitee.com/ 如果可以使用的话,建议从下面两个网站使用, …

Petronas 使用 SAP EWM 的 Liquid UI 离线将运营效率提高了 70%

背景 Petroliam Nasional Berhad(也称为“Petronas”)总部位于马来西亚,是一家充满活力的国际能源公司,业务遍及100多个国家,在各种石油相关活动方面拥有30多年的经验。马来西亚国家石油公司生产在道德和可持续方面推…

数据结构【树】

数据结构与算法之树结构 树的定义树的基本术语树结构和线性结构的比较树的应用 树的定义 树是一种非线性的数据结构,它是一个包含n(n>1)个节点,(n-1)条边的有穷集合。树有多种表现形式,把它叫做“树”是因为它看起来像一个倒挂的树&#…

redis主从(windows版本)

1. 下载redis 1.1、Github下载地址:Releases microsoftarchive/redis GitHub 1.2、百度网盘下载地址:Redis-x64-3.2.100.zip 密码:kdfq 1.3、也可以自行从其它地方下载 2.配置redis主,设置服务,然后启动 端口…

【Vue3】学习笔记-Composition API 的优势

1.Options API 存在的问题 使用传统OptionsAPI中(配置型API),新增或者修改一个需求,就需要分别在data,methods,computed里修改 。 这张图告诉我们,我们在v2的时候功能放到配置中。它想告诉我们所有的功能都拆散了。 …

0基础学习VR全景平台篇 第58篇:高级功能-AI人像合成

功能位置示意 一、本功能将用在哪里? AI人像合成是蛙色VR商业级方案中,重要的裂变推广功能之一; 选取对应照片,通过后台生成实现个人与场景的合影留念,一键转发分享快速传播裂变。 观者者使用本功能时,将…

基于OpenCV 和深度学习实现微笑检测-附免费源码

文末提供免费的源代码下载链接 我们将使用 SMILES 数据集来训练我们的卷积神经网络。一旦我们的模型训练完毕,我们将按照与上一个教程中相同的步骤来检测图像和视频中的微笑: 我们将使用 Haar 级联来检测图像中的人脸。从图像中提取人脸区域。将面部区域传递给我们的网络进行…

Spring Boot 中的 JPA 是什么,如何使用

Spring Boot 中的 JPA 是什么,如何使用 简介 JPA (Java Persistence API) 是一种标准的 ORM (Object Relational Mapping) 规范,用于将 Java 对象映射到关系型数据库中。它提供了一种面向对象的方式来操作数据库,使得开发者可以更加方便地进…

【openGauss5.0企业版一主一备集群】—运维

【openGauss5.0企业版一主一备集群】—运维 🔻 一、openGauss5.0主从集群的维护🔰 1.1 查看单个节点状态🔰 1.2 查看集群所有节点状态🔰 1.3 集群启停🔰 1.4 switchover 主备切换🔰 1.5 模拟主库宕机&#…

Git gui教程---第三篇 Git gui的使用 配置提交信息

配置提交信息 配置好提交的信息,跑路的话,别人也能找到你,哈哈哈。点击“编辑”,选择“选项”,需要关注的地方有三个,一个是全局的版本库,一个是TEST版本库,一个是合并工具。 全局代…

数据库表的创建以及操作

1.创建数据库Market,在Market中创建数据表customers,customers表结构如表4.6所示,按要求进行操作。 (1)创 建数 据库 Market。 (2)创建数据表custo mers, 在c_num字段 上添加主键约束 和自增 约束,在c_birth字段 上添加非空约束。 (3)将c_c…

梯度流(Gradient Flow):探索通往最小值之路

©PaperWeekly 原创 作者 | 苏剑林 单位 | 追一科技 研究方向 | NLP、神经网络 在这篇文章中,我们将探讨一个被称为“梯度流(Gradient Flow)”的概念。简单来说,梯度流是将我们在用梯度下降法中寻找最小值的过程中的各个点连…

【Linux】进程信号之信号的产生

进程信号 一 一、信号入门1、信号的一些特性2、信号的处理方式信号捕捉初识 3、Linux下的信号 二、信号的产生1、通过终端按键产生信号2、调用系统函数向进程发信号a、kill函数b、raise函数c、abort函数 3. 由软件条件产生信号4、硬件异常产生信号 结语 一、信号入门 什么是信号…

yolov7增加AFPN

论文学习:AFPN: Asymptotic Feature Pyramid Network for Object Detection-全新特征融合模块AFPN,完胜PAFPN_athrunsunny的博客-CSDN博客 论文的作者是说在yolo上效果有提升,不过还没有测试,具体还不清楚,把代码撸出来…