拿捏c语言指针(上)

目录

前言

​编辑

指针

内存与地址

计算机常见单位

理解编址

取地址,指针变量,解引用

取地址

指针变量

解引用

指针变量大小

指针类型的作用

char*解引用后

指针+-整数

应用

void*指针

const修饰指针变量

const修饰普通变量

const修饰指针变量

理清pa与pa*的含义

 代码 int const*pa=&a;

​编辑  代码  int *const pa=&a;

指针计算

指针-指针

应用:模拟实现strlen函数

野指针

成因

指针未初始化

指针越界访问

指针指向空间释放

规避野指针


前言

你是否也是在学习c语言碰到了拦路虎?

下面,我将通过这篇文章来和大家一起了解并熟悉c语言指针,拿捏指针的每一处细节~


创作不易,可以帮忙点点赞吗

如有差错,欢迎指出



指针

c语言中的指针其实就是计算机内存中的地址,即内存单元的编号通过地址,CPU就可以快速找到一个内存空间。

所以  内存单元的编号==地址==指针

但是我们口头上的指针实际是指针变量。

内存与地址

计算机中的内存可以类比为生活中的一栋房子,地址则是房子中每个房间的门牌号。

内存被划分为内存单元(1个字节),

计算机常见单位

1byte(字节)=8bit(比特位)

1KB=1024byte

1MB=1024KB

1GB=1024MB

1TB=1024GB

1PB=1024TB

理解编址

如图 以下为CPU和内存之间交互数据的大致模式

若CPU要从内存中取出一个值,则cpu通过控制总线下达取出的命令,通过地址总线获得内存中的地址,通过地址找到目标值后,再通过数据总线传给CPU。

若CPU要在内存中存储一个值,则cpu通过控制总线下达存储的命令,通过地址总线给目标值开辟一个空间,并编址,通过地址,CPU通过数据总线把值传给内存,并存储起来。

取地址,指针变量,解引用

取地址

如图,在32位的机械下,打印变量a的地址

其中a占4个字节,打印的地址其实是第一个字节的地址

指针变量

指针变量是专门存放地址的,

如图

int* pa = &a; 

pa 是 指针变量 用于存放地址(指针)
*说明pa是指针变量,int说明pa指向的对象是int类型的

解引用


*pa =20 ;

* 解引用操作符,意为通过pa中的地址找到a

*pa等价于a,所以等同于代码a=20

指针变量大小

指针变量大小取决于一个地址的存放需要多大空间

32位机器上:地址线是32根,地址的二进制序列就是32bit位,要4字节(32bit位)的空间存放地址。所以32位机器的指针变量大小都是4个字节。

指针变量大小与类型无关,在相同的平台下,大小都相同。

如图

32位机器


同理,64位机器上,指针变量大小都是8个字节。

64位机器


指针类型的作用

指针类型决定了对指针解引用的时候有多大权限(一次能操作几个字节)

比如 char*的指针解引用就只可以访问1个字节,而int*是4个。

图解如下

未解引用之前


int*解引用后


char*解引用后

指针+-整数

指针的类型决定了指针向前或向后走一步有多大(距离

如图不同指针类型加减整数的结果

int*的pa+1


char*的pa+1

应用
#include<stdio.h>
//指针+-整数的应用
int main()
{
	int arr[10] = { 0 };
	int* p = &arr[0];
	//将数组全部初始化为1
	for (int i = 0; i < 10; i++)
	{
		*p = 1;
		p++;
	}
	//打印
    p = &arr[0];//再让p回到起始位置
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", *p);
		p++;
	}

	return 0;
}

void*指针

void*指针是无具体类型的特殊指针(泛型指针),可以接受任意类型地址

但是 不能直接进行解引用操作,也不能进行指针+-整数

const修饰指针变量

const修饰普通变量

如图,const仅仅是在语法上做了限制,我们习惯叫a为常变量

用指针变量pa间接修改a的值却不会报错,无视const。

const修饰指针变量

const修饰指针变量

理清pa与pa*的含义

 pa里面存放的是地址(a的地址)
pa是变量,有自己的地址
*pa是pa指向的空间

 代码 int const*pa=&a;

const限制的是*pa,修改*pa会报错,但修改pa的值没问题


  代码  int *const pa=&a;

const限制的是pa,可以修改*pa,但修改pa会报错

指针计算

指针-指针

指针-指针 即 地址-地址,得到的绝对值指针和指针之间的元素个数

前提条件:两个指针指向同一块空间

应用:模拟实现strlen函数

分别使用了 指针-整数 指针-指针两种方法

其中代码while(*s!='\0')可以简化为while(*s)

因为\0的ASCII码值为0,地址加到\0时(0为假)自然会跳出循环

//指针-整数
int my_strlen1(char* s)//传字符串的地址,返回字符串长度
{
	int count = 0;
	while (*s != '\0')
	{
		count++;
		s++;//地址+1
	}
	return count;
}

//指针-指针
int my_strlen2(char* s)
{
	char* start = s;
	while (*s != '\0')
	{
		s++;
	}
	return s - start;//地址-地址
}
#include<stdio.h>
int main()
{
	//strlen 求字符串的长度 求‘\0’之前的字符串长度
	int len =my_strlen1("abcda");//模拟实现strlen函数
	printf("%d\n", len);
	len = my_strlen2("abcda");//模拟实现strlen函数
	printf("%d\n", len);

	return 0;
}

结果

野指针

野指针是指针指向位置是不可知的(随机的、不正确的、没有限制的)

成因

指针未初始化

指针越界访问

指针指向空间释放

规避野指针

初始化指针;若不知道指针应该指向哪里,可以指向NULL

所以,指针变量不使用时,要及时置NULL

NULL是c语言中的标识符常量值为0,地址也为0,但此地址无法使用,读写地址会报错

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

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

相关文章

C++数据结构与算法——字符串

C第二阶段——数据结构和算法&#xff0c;之前学过一点点数据结构&#xff0c;当时是基于Python来学习的&#xff0c;现在基于C查漏补缺&#xff0c;尤其是树的部分。这一部分计划一个月&#xff0c;主要利用代码随想录来学习&#xff0c;刷题使用力扣网站&#xff0c;不定时更…

在已有代码基础上创建Git仓库

在已有代码基础上创建Git仓库 背景方法处理问题 背景 先进行了代码编写&#xff0c;后续想放入仓库方便大家一起合作开发&#xff0c;此时需要在已有代码的基础上建立仓库。 方法 首先在Gitee或者GitHub上创建仓库&#xff0c;这里以Gitee为例。创建完后&#xff0c;我们可以…

java8-用optional取代nu11

本章内容口nu11引用引发的问题&#xff0c;以及为什么要避免nu11引用从nu11到optiona1:以nu11安全的方式重写你的域模型让optiona1发光发热:去除代码中对nu11的检查 读取optiona1中可能值的几种方法口对可能缺失值的再思考 如果你作为Java程序员曾经遭遇过Nu11PointerException…

Excel导入预览与下载

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; Excel导入预览与下载 preview Controller PostMapping("preview")ApiOperation("上传拒付预警预览")public Result<List<ResChargebackWa…

猫头虎分享已解决Bug ‍ || Java Error: Could not find or load main class com.example.Main

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

每日OJ题_算法_递归③力扣206. 反转链表

目录 力扣206. 反转链表 解析代码 力扣206. 反转链表 206. 反转链表 LCR 024. 反转链表 难度 简单 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,…

基于Java (spring-boot)和微信小程序的奶茶点餐小程序

一、项目介绍 基于Java (spring-boot)和微信小程序的奶茶点餐小程序功能&#xff1a;客户端登录、个人中心、点餐、选规格、去结算、取餐、我的信息、管理员登录、管理员首页、用户管理、商品管理、商品编辑、商品种类、订单管理、订单处理、等等等。 适用人群&#xff1a;适合…

MessageQueue --- RabbitMQ

MessageQueue --- RabbitMQ RabbitMQ IntroRabbitMQ 核心概念RabbitMQ 分发类型Dead letter (死信)保证消息的可靠传递 RabbitMQ Intro 2007年发布&#xff0c;是一个在AMQP&#xff08;高级消息队列协议&#xff09;基础上完成的&#xff0c;可复用的企业消息系统&#xff0c;…

Netty Review - 底层零拷贝源码解析

文章目录 Pre概述源码解析入口索引AbstractNioByteChannel.NioByteUnsafe#readallocHandle.allocate(allocator) 小结传统的零拷贝 Pre Netty Review - 直接内存的应用及源码分析 概述 Netty 的零拷贝技术是通过优化数据传输过程中的数据复制操作&#xff0c;以降低系统的开销…

Java 基于 SpringBoot+Vue 的酒店管理系统,附源码

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

Java微服务架构的选择:Spring Cloud、Kubernetes还是Kubernetes + Istio?

微服务架构已经成为现代软件开发的趋势&#xff0c;其可以带来高度可伸缩性、松耦合性和团队自治性等优势。 在Java开发领域中&#xff0c;选择适合的微服务架构是非常关键的决策&#xff0c;本文将探讨Spring Cloud、Kubernetes和KubernetesIstio这三个架构选择的优势和劣势。…

抽象的前端

问题背景&#xff1a;vue3&#xff0c;axios 直接导致问题&#xff1a;路由渲染失败 问题报错&#xff1a;Uncaught SyntaxError: The requested module /node_modules/.vite/deps/axios.js?v7bee3286 does not provide an export named post (at LoginIn.vue:16:9) 引入组…

[NSSRound#16 Basic]Web

1.RCE但是没有完全RCE 显示md5强比较&#xff0c;然后md5_3随便传 md5_1M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1U%5D%83%60%FB_%07%FE%A2&md5_2M%C9h%FF%0E%E3%5C%20%95r%D4w…

Spring AOP的实现方式

AOP基本概念 Spring框架的两大核心&#xff1a;IoC和AOP AOP&#xff1a;Aspect Oriented Programming&#xff08;面向切面编程&#xff09; AOP是一种思想&#xff0c;是对某一类事情的集中处理 面向切面编程&#xff1a;切面就是指某一类特定的问题&#xff0c;所以AOP可…

CMake进行C/C++与汇编混合编程

1. 前提 这篇文章记录一下怎么用CMake进行项目管理, 并用C/C和汇编进行混合编程, 为了使用这项技术, 必须在VS的环境中安装好cmake组件 由于大部分人不会使用C/C与汇编进行混合编程的情况。所以这篇文章并不适用于绝大部分人不会对其中具体细节进行过多叙述。只是做一些简单的…

Java的集合框架和泛型

文章目录 集合框架什么是集合框架类和接口总览 集合框架的重要性背后所涉及的数据结构以及算法什么是数据结构容器背后对应的数据结构什么是算法 包装类基本数据类型和对应的包装类装箱和拆箱自动装箱和自动拆箱 泛型什么是泛型引出泛型语法泛型类泛型的上界(没有下界)泛型方法…

知识图谱:py2neo导入周杰伦歌单csv文件

文章目录 py2neo导入csv文件py2neo导入周杰伦歌单csv效果展示 py2neo导入csv文件 之前写的知识图谱指南 知识图谱&#xff1a;py2neo将csv文件导入neo4j 因为没有区分不同实体entity的类型&#xff0c;所以颜色相同&#xff0c;无法相互区分歌手、歌曲还是专辑等等。 py2ne…

Linux下的自动化任务与计划任务:让你的系统更智能

在日常的Linux系统管理中&#xff0c;你是否经常需要定时执行某些任务&#xff0c;或者希望在系统启动时自动运行某些脚本&#xff1f;如果是的话&#xff0c;那么自动化任务和计划任务将是你的得力助手。它们可以帮助你提高系统效率、减少人工干预&#xff0c;并确保任务能够按…

绿色化 数据库 MongoDB 和 mysql 安装

绿色化 数据库 MongoDB 和 mysql 安装 【1.1】 前言 为什么要绿色化 安装呢&#xff1f;因为系统老升级&#xff0c;老重装&#xff01;&#xff01;也方便了解下数据库配置和库在那 绿色软件喜欢一般放在 D盘tools目录里 D:\tools\ 数据库 MongoDB D:\tools\MongoDB 数…

制作怎么自己搭建一个网站

制作怎么自己搭建一个网站 一.领取一个免费域名和SSL证书&#xff0c;和CDN 1.打开网站链接&#xff1a;https://www.rainyun.com/ycpcp_ 首先创建一个CDN&#xff0c;这里以我加速域名“cdntest.biliwind.com 1”为例 这里就要填写 cdntest.biliwind.com 1 &#xff0c;而…