第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,一经查实,立即删除!

相关文章

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证书&…

【汇编】#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. 搭建演…

声卡喊话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;用了…

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;提高开发效…

优选算法[1]

目录 1.双指针&#xff1b; 2.滑动窗口&#xff1b; 3.二分查找&#xff1b; 4.前缀和&#xff1b; 1.双指针&#xff1b; 包括对撞指针和快慢指针(一般用来循环&#xff09;&#xff1b; 题目类型&#xff1a;移动零&#xff0c;复写零&#xff0c;快乐数&#xff0c;盛…

【UE5】动画混合空间的基本用法

项目资源文末百度网盘自取 什么是动画混合空间 混合空间分为两种: 通过一个数值控制通过两个数值控制 下面通过演示让大家更直观地了解 在Character文件夹中单击右键,选择动画(Animation),选择旧有的混合空间1D 然后选择骨骼&#xff08;动画是基于骨骼显示的,所以需要选择…

vue防止用户连续点击造成多次提交

中心思想&#xff1a;在第一次提交的结果返回前&#xff0c;将提交按钮禁用。 方法一&#xff1a;给提交按钮加上disabled属性&#xff0c;在请求时先把disabled属性改成true&#xff0c;在结果返回时改成false 方法二&#xff1a;添加loading遮罩层&#xff0c;可以直接使用e…

北京保险服务中心携手镜舟科技,助推新能源车险市场规范化

2022 年&#xff0c;一辆新能源汽车在泥泞的小路上不慎拖底&#xff0c;动力电池底壳受损&#xff0c;电池电量低。车主向保险公司报案&#xff0c;希望能够得到赔偿。然而&#xff0c;在定损过程中&#xff0c;保司发现这辆车的电池故障并非由拖底事件引起&#xff0c;而是由于…

EDM营销平台的核心功能?如何做精准营销?

EDM营销平台如何选择&#xff1f;怎么使用邮件营销平台优化发信&#xff1f; EDM营销平台以其独特的优势&#xff0c;成为了企业实现精准营销、提升品牌影响力的重要工具。那么&#xff0c;EDM营销平台究竟拥有哪些核心功能呢&#xff1f;接下来&#xff0c;AokSend就来一一探…

PyQt5---初识PyQt5相关及开发实战介绍

什么是GUI GUI是Graphical User Interface&#xff08;图形用户界面&#xff09;的缩写&#xff0c;是一种用户与计算机交互的方式&#xff0c;通过使用图形化的元素&#xff08;如按钮、窗口、菜单等&#xff09;来帮助用户完成任务。GUI使得用户可以通过鼠标、键盘等输入设备…

【C语言】整数存储、大小端概念

文章目录 整数存储大小端 整数存储 在计算机中&#xff0c;整数都是通过二进制保存的&#xff0c;不论是十六进制还是八进制还是十进制 整数的2进制表⽰⽅法有三种&#xff0c;即原码、反码和补码 对于整形来说&#xff1a;数据存放内存中其实存放的是补码 在计算机系统中&…

LinuxU盘挂载原理,为什么要用到U盘挂载及实现U盘挂载

目录 一、U盘挂载原理 二、为什么要用到U盘挂载 三、实现U盘挂载 一、准备工作 1、安装gcc 2、下载ntfs-3g 3、解压 4、编译准备 5、编译并安装 二、挂载演示 一、U盘挂载原理 Linux的U盘挂载原理涉及以下几个方面&#xff1a; 设备识别&#xff1a;当您将U盘插入Lin…

DVWA 靶场搭建

文章目录 环境说明1 DVWA 简介2 DVWA 安装 环境说明 操作系统&#xff1a;Windows 10PHPStudy 版本: 8.1.1.3Apache 版本&#xff1a;2.4.39MySQL 版本 5.7.26 1 DVWA 简介 DVWA&#xff08;Damn Vulnerable Web App&#xff09;是一个基于 “PHP MySQL” 搭建的Web应用程序&…

Linux多进程中wait()函数学习

wait()函数是Linux/Unix系统里的一个系统级函数&#xff0c;在C语言中通过#include <sys/wait.h>包含该系统调用的头文件。 想要查看如何使用这个函数&#xff0c;可以在终端中输入&#xff1a; man 2 wait如下图&#xff1a; wait系统调用可以让父线程阻塞等待子线程的…