第12章 指针

以下内容是学习尚硅谷

12.1 指针基本介绍

1)指针是C语言的精华,也是C语言的难点
2)指针,也就是内存的地址;所谓指针变量,也就是保存了内存地址的变量。关于指针的基本使用,在讲变量的时候做了入门级的介绍
3)获取变量的地址,用&,比如:int num=10,获取num的地址:&num
4)指针类型,指针变量存在的是一个地址,这个地址指向的空间存的才是值

比如: int *ptr = # ptr就是指向 int类型的指针变量,即 ptr是 int*类型。

5)获取指针类型所指向的值,使用: * (取值符号),比如: int * ptr,使用*ptr获取 ptr指向的值

12.2 什么是指针

在这里插入图片描述
在这里插入图片描述

12.3 指针的算术运算

指针是一个用数值表示的地址。可以对指针执行算术运算。可以对指针进行四种算术运算:++、–、+、-

12.3.1 指针递增操作(++)

1)案例演示

#include <stdio.h>
#include <string.h>
#include <stdio.h>const int MAX=3;int main(){int var[]={10,100,200};int i,*ptr;ptr=var;for(i=0;i<MAX;i++){printf("var[%d]地址=%p\n",i,ptr);printf("存储值:var[%d]=%d\n",i,*ptr);ptr++;//ptr=ptr+1(1个int字节数)}getchar();return 0;
}

2)示意图
在这里插入图片描述
3)小结

  • 数组在内存中是连续分布的
  • 当对指针进行++时,指针会按照它指向的数据类型字节数大小增加

12.3.2 指针递减操作(–)

#include <stdio.h>
#include <string.h>
#include <stdio.h>const int MAX=3;int main(){int var[]={10,100,200};int i,*ptr;ptr=&var[MAX-1];//&var[2]for(i=MAX;i>0;i--){printf("ptr存放的地址=%p\n",ptr);printf("存储值:var[%d]=%d\n",i-1,*ptr);ptr--;//ptr=ptr-1(1个int字节数)}getchar();return 0;
}

2)小结

  • 数组在内存中是连续分布的
  • 当对指针进行–时,指针会按照它指向的数据类型字节数大小减少

12.3.3 指针+、-操作

1)案例演示

#include <stdio.h>
#include <string.h>
#include <stdio.h>int main(){int var[]={10,100,200};int i,*ptr;ptr=var;ptr+=2;printf("var[2]=%d var[2]的地址=%p ptr存储的地址=%p ptr指向的值=%d",var[2], &var[2], ptr,*ptr);getchar();return 0;
}

2)小结
可以对指针按照指定的字节数大小进行+或者–的操作,可以快速定位你要的地址

12.4 指针的比较

指针可以用关系运算符进行比较,如==、<<=和>>=。如果pl和 p2指向两个变量,比如同一个数组中的不同元素,则可对pl 和 p2进行大小比较,看下面代码,说明输出什么?

案例1

#include <stdio.h>
#include <string.h>
#include <stdio.h>int main(){int var[]={10,100,200};int *ptr;ptr=var;//if(ptr == var[0]){//错误,类型不一样(int *)和(int )//printf("ok1");//}if(ptr==&var[0]){//可以printf("\nok2");}if(ptr==var){//可以printf("\nok3");}if(ptr>=&var[1]){//可以比较,但是返回falseprintf("\nok4");//不会输出}getchar();return 0;
}

案例2

#include <stdio.h>
#include <string.h>
#include <stdio.h>const int MAX=3;int main(){int var[]={10,100,200};int i,*ptr;ptr=var;i=0;while (ptr<=&var[MAX-2]) {printf("Address of var[%d]=%x\n",i,ptr);printf("Value of var[%d]=%d\n",i,*ptr);ptr++;i++;}getchar();return 0;
}

12.5 指针数组

12.5.1 基本介绍

要让数组的元素指向int或其他数据类型的地址(指针)。可以使用指针数组。

12.5.2 指针数组定义

数据类型 *指针数组名[大小];

1)比如:int *ptr[3];
2)ptr声明为一个指针数组
3)由3个整数指针组成。因此,ptr中的每个元素,都是一个指向int值的指针

12.5.3 指针数组快速入门和内存布局示意图

#include <stdio.h>
#include <string.h>
#include <stdio.h>const int MAX=3;int main(){int var[]={10,100,200};int i,*ptr[3];for(i=0;i<MAX;i++){ptr[i]=&var[i];}for(i=0;i<MAX;i++){printf("Value of var[%d]=%d ptr[%d]本身的地址=%p \n",i,*ptr[i],i,&ptr[i],&ptr[i]);}getchar();return 0;
}

在这里插入图片描述

12.6 指向指针的指针(多重指针)

12.6.1 基本介绍

在这里插入图片描述

12.6.2 多重指针(二级、三级)快速入门案例

1)一个指向指针的指针变量必须如下声明,即在变量名前放置两个星号。例如,下面声明了一个指向 int类型指针的指针:
int **ptr;//ptr的类型是int **
2)当一个目标值被一个指针间接指向到另一个指针时,访问这个值需要使用两个星号运算符,比如 **ptr
3)案例演示+内存布局图

#include <stdio.h>
#include <string.h>int main(){int var;int *ptr;//一级指针int **pptr;//二级指针int ***ppptr;//三级指针var=3000;ptr=&var;pptr=&ptr;ppptr=&pptr;printf("var的地址=%p var=%d \n",&var,var);printf("ptr的本身的地址=%p ptr存放的地址=%p *ptr=%d \n",&ptr,ptr,*ptr);printf("pptr的本身的地址=%p pptr存放的地址=%p **pptr=%d \n",&pptr,pptr,**pptr);printf("ppptr的本身的地址=%p ppptr存放的地址=%p ***ppptr=%d \n",&ppptr,ppptr,***ppptr);getchar();return 0;
}

12.6.3 对应的内存布局图

在这里插入图片描述

12.7 传递指针(地址)给函数

12.8 返回指针的函数

12.9 函数指针(指向函数的指针)

12.10 回调函数

12.11 指针的注意事项和细节

12.12 动态内存分配

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

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

相关文章

WAPI模块AT指令驱动

一、前言 由于项目更迭&#xff0c;需要将原4G模块更换为国内的WAPI协议模块&#xff0c;主控芯片NRF52840无需改动其他部分&#xff0c;只需要将串口部分的数据格式稍作更改即可。 编程风格和之前的esp8266一致&#xff0c;同样都是AT指令来配置模块&#xff0c;由于主…

Java封装的优点

目录 提高代码可维护性 降低耦合度 保护数据安全性 封装如何提高安全性 数据隐藏 访问控制 限制接口 错误隔离

请解释Redis是什么?它有哪些主要应用场景?Redis支持哪些数据类型?并描述每种数据类型的特性和使用场景。

请解释Redis是什么&#xff1f;它有哪些主要应用场景&#xff1f; Redis是一款内存高速缓存NoSQL数据库&#xff0c;使用C语言编写&#xff0c;它支持丰富的数据类型&#xff0c;如String、list、set、zset、hash等&#xff0c;并且这些数据类型都直接支持数据的原子性操作&…

d2-crud-plus 使用小技巧(四)—— 搜索限制只能输入数字

需求 搜索时有些字段需要限制&#xff0c;比如只能输入数字&#xff0c;不能存在其他字符包括空格。 效果 事情焦点后先触发校验&#xff0c;在触发查询。 代码 crud.js export const crudOptions (vm) > {return {columns: [{title: 号码,key: number,search: { //…

比Let‘s Encrypt更简单更齐全的免费证书申请教程

步骤一 打开JoySSL官网&#xff0c;注册属于你的专属账号&#xff1b; 永久免费SSL证书申请地址真正完全且永久免费&#xff01;不用您花一分钱&#xff0c;SSL证书免费使用90天&#xff0c;并且还支持连续签发。JoySSL携手全球权威可信顶级根&#xff0c;自研新一代SSL证书&…

打zip包,支持有空文件夹

支持有空文件夹 // 打包String url dir0 File.separator dir1;log.info("将此文件夹打成zip包&#xff1a;"url);String urlZip dir0 File.separator dir1 ".zip";File file new File(url);// 方法2&#xff1a;压缩包内支持空文件夹ZipUtil.zip(F…

【汇编】#3 8086与数据有关的寻址方式

文章目录 操作码与操作数1. 8086处理器的与数据有关的寻址方式1.1 立即数寻址方式1.2 寄存器寻址方式 2. 有效&#xff08;偏移&#xff09;地址&#xff08;effective address&#xff0c;EA&#xff09;与缺省段寄存器选择tips:段跨越前缀2.1 直接寻址tips:直接寻址与立即寻址…

GitOps实践之Argo CD (2)

argocd 【-1】argocd可以解决什么问题? helm 部署是手动的?依赖流水线。而有时候仅仅更新一个小东西,流水线跑好久,CD真的不应该和CI耦合。不同环境的helm配置不同,手动修改问题多,可以用git管理起来,例如分不同环境用目录区分。argocd创建应用可以不通环境部署到不同集…

Seata 2.x 系列【12】高可用集群部署

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Seata 版本 2.0.0 本系列Spring Boot 版本 3.2.0 本系列Spring Cloud 版本 2023.0.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-seata-demo 文章目录 1. 概述2. 搭建演…

Linux下新增有root权限的用户

步骤&#xff1a; 1.以 root 用户身份登录到 CentOS 服务器。 2.使用以下命令创建新用户&#xff08;将 newuser 替换为您想要创建的用户名&#xff09;&#xff1a; sudo adduser username 3.为新用户设置密码&#xff1a; sudo passwd username 按照提示输入新增用户密码 …

计算机基础1-汇编基础

汇编语言是一种低级的计算机语言&#xff0c;它直接与计算机硬件进行交互。在汇编语言中&#xff0c;指令由一系列助记符&#xff08;mnemonic&#xff09;组成&#xff0c;用于执行特定的操作&#xff0c;如数据传输、算术运算和控制流程等。每个指令都对应着一条机器码&#…

《数据安全法》关于数据出境的条款

《数据安全法》关于数据出境的条款 《中华人民共和国数据安全法》于2021年6月10日通过&#xff0c;2021年9月1日起实施&#xff09;。 在《数据安全法》中&#xff0c;第三十一条&#xff1a;“关键信息基础设施的运营者在中华人民共和国境内运营中收集和产生的重要数据的出境…

Golang如何使用命令行-- flag库

参考文献&#xff1a; flag package - flag - Go Packages 使用&#xff1a; import "flag" var nFlag flag.Int("n", 1234, "help message for flag n") 上述方法返回的是一个指针变量nFlag&#xff0c;如果我们要打印&#xff0c;应该使用…

声卡喊话IP喇叭,IP网络吸顶天花喇叭

声卡喊话IP喇叭&#xff0c;IP网络吸顶天花喇叭 SV-7043VP是一款ip/sip网络吸顶喇叭&#xff0c;具有10/100M以太网接口&#xff0c;从网络接口接收网络的音频数据后播放。本网络吸顶喇叭可以与其他广播主机、服务器软件和采播主机配合使用&#xff0c;实现音频的播放&#xf…

大语言模型:Query Rewriting for Retrieval-Augmented Large Language Models

总体思路 作者首先指出大语言模型虽然取得了很好的效果&#xff0c;但是仍然存在幻觉和时间顺序混乱的问题&#xff0c;因此需要额外知识库和LLM内部知识库相结合&#xff0c;来修正&#xff1b;因此优化传统的retriever-reader的方案成为需要&#xff1b;目前的研究方案当中使…

log4cplus在Qt linux中的应用与问题解决

log4cplus在Qt linux中的应用与问题解决 背景log4cplus下载遇到问题&#xff1a;libm.so.6:undefined reference to __strtof128_nanGLIBC_PRIVATE‘解决方案编译生成在Qt工程里面添加对应依赖编译运行成功 背景 最近工作中需要用到log4cplus的日志做一些记录&#xff0c;用了…

html5cssjs代码 010 个人简历模板一

html5&css&js代码 010 个人简历模板一 一、代码二、解释 这段HTML代码定义了一个个人简历的页面布局和样式。页面分为多个部分&#xff0c;包括基本信息、自我评价、工作经历、教育经历、软件产品及著作、未来研究方向等。每个部分都使用section标签包裹&#xff0c;并…

Linux——ELK日志分析系统

实验环境 虚拟机三台CentOS 7.9&#xff0c; 组件包 elasticsearch-5.5.0.rpm elasticsearch-head.tar.gz node-v8.2.1.tar.gz phantomjs-2.1.1-linux-x86_64.tar.bz2 logstash-5.5.1.rpm kibana-5.5.1-x86_64.rpm 初始…

Lombok原理及实例(Java) - 简化JavaBean开发

Lombok 1.作用:简化javabean开发 2.使用:a.下插件 -> 如果是idea2022不用下载了,自带b.导lombok的jar包c.修改设置 1.lombok介绍 Lombok通过增加一些“处理程序”&#xff0c;可以让javabean变得简洁、快速。 Lombok能以注解形式来简化java代码&#xff0c;提高开发效…

国金证券春招算法岗面试

没有去官网投&#xff0c;在BOSS直聘上投递&#xff0c;HR打电话确认过出勤后给用人部门评估&#xff0c;最后直接让用人部门的小leader面试&#xff0c;是一个博士 面试过程&#xff1a; 1.先介绍一下自己 2.介绍一下做过的项目 3.项目里自己具体做哪些工作 4.项目里怎么…