拿捏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];//将数组全部初始化为1for (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,但此地址无法使用,读写地址会报错

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

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

相关文章

自动化测试-RIDE编写自动化脚本

自动化脚本软件测试的必修内容&#xff0c;是自动化测试的核心&#xff0c;脚本的逻辑严谨性、可维护性非常重要&#xff0c;优秀的自动化脚本需要能兼顾用例的正确有效性和自动化测试的效率&#xff0c;本篇文章将介绍如何用RIDE写自动化脚本。我们将深入探讨RIDE的具体用法&a…

相机图像质量研究(22)常见问题总结:CMOS期间对成像的影响--光学串扰

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

C++:迭代器的封装思想

C&#xff1a;迭代器的封装思想 list迭代器实现反向迭代器实现 本博客将通过实现list的迭代器&#xff0c;以及它的反向迭代器&#xff0c;来帮助大家理解迭代器的底层逻辑&#xff0c;以及封装思想。 list迭代器实现 迭代器是一个遍历容器的工具&#xff0c;其可以通过自增自…

Linux POSIX信号量 线程池

Linux POSIX信号量 线程池 一. 什么是POSIX信号量&#xff1f;二. POSIX信号量实现原理三. POSIX信号量接口函数四. 基于环形队列的生产消费模型五. 线程池 一. 什么是POSIX信号量&#xff1f; POSIX信号量是一种用于同步和互斥操作的机制&#xff0c;属于POSIX&#xff08;Po…

项目管理工具软件Maven趣闻

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl Maven这个单词来自于意第绪语&#xff08;Yiddish&#xff09;&#xff0c;这是一种与德语和希伯来语有密切关系的犹太民族语言。在这个语境中&#xff0c;Maven意为“知识的…

ChatGPT高效提问—prompt实践(智能辅导-心理咨询-职业规划)

ChatGPT高效提问—prompt实践&#xff08;智能辅导-心理咨询-职业规划&#xff09; ​ 智能辅导是指利用人工智能技术&#xff0c;为学习者提供个性化、高效的学习辅助服务。它基于大数据分析和机器学习算法&#xff0c;可以针对学习者的学习行为、状态和能力进行评估和预测&a…

Shell - 学习笔记 - 2.15 - Shell关联数组(下标是字符串的数组)

现在最新的 Bash Shell 已经支持关联数组了。关联数组使用字符串作为下标&#xff0c;而不是整数&#xff0c;这样可以做到见名知意。 关联数组也称为“键值对&#xff08;key-value&#xff09;”数组&#xff0c;键&#xff08;key&#xff09;也即字符串形式的数组下标&…

AutoSAR(基础入门篇)10.1-Autosar_Ecum模式管理概述

目录 一、什么是模式管理 二、再谈BswM 1、BswM概述 2、BswM执行流程 三、再谈EcuM 模式管理应该算是我们实践篇中较难的内容了,还有就是诊断那章也比较难。因为模式管理里面可能回涉及到很多的名词,很多的特性,所以博主准 备分个8次左右来讲解这些内容。但是在实际的应…

如何在 Angular 中使用环境变量

简介 如果你正在构建一个使用 API 的应用程序&#xff0c;你会想在开发过程中使用测试环境的 API 密钥&#xff0c;而在生产环境中使用生产环境的 API 密钥。在 Angular 中&#xff0c;你可以通过 environment.ts 文件创建环境变量。 在本教程中&#xff0c;你将学习如何在 A…

【Java万花筒】数据流的舵手:大数据处理和调度库对比指南

智慧的导航仪&#xff1a;为您的数据流选择正确的大数据处理和调度库 前言 在如今的信息时代&#xff0c;大数据处理和调度已经成为许多企业和组织中关键的任务。为了有效地处理和管理大规模数据流&#xff0c;选择适合的调度库是至关重要的。本文将介绍几种常用的大数据处理…

【前端工程化面试题】使用 webpack 来优化前端性能/ webpack的功能

这个题目实际上就是来回答 webpack 是干啥的&#xff0c;你对webpack的理解&#xff0c;都是一个问题。 &#xff08;1&#xff09;对 webpack 的理解 webpack 为啥提出 webpack 是啥 webpack 的主要功能 前端开发通常是基于模块化的&#xff0c;为了提高开发效率&#xff0…

MATLAB知识点:datasample函数(★★☆☆☆)随机抽样的函数,能对矩阵数据进行随机抽样

讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 节选自第3章&#xff1a;课后习题讲解中拓展的函数 在讲解第三…

数据类型与变量

目录 作业回顾 有关JDK, JRE, JVM三者&#xff1a; 判断题 新课学习 字面常量 数据类型 变量 整型变量 长整型变量 短整型变量 字节型变量 浮点型变量 字符型变量 布尔型变量 类型转换 自动类型转换&#xff08;隐式&#xff09; 强制类型转换&#xff08;显式…

Navicat安装使用连接MySQL

目录 安装登录MySQL登录MySQL用Navicat连接MySQL 安装 选择“我同意”&#xff0c;点击下一步。 选择安装的目标文件夹&#xff0c;点击下一步。 点击下一步。 点击下一步。 点击安装。 软件安装需要一些时间&#xff0c;请耐心等待 点击“完成”。 注册 输入 密钥&#x…

Crypto-RSA3

题目&#xff1a;&#xff08;BUUCTF在线评测 (buuoj.cn)&#xff09; 共模攻击 ​ 前提&#xff1a;有两组及以上的RSA加密过程&#xff0c;而且其中两次的m和n都是相同的&#xff0c;那么就可以在不计算出d而直接计算出m的值。 ​ 设模数为n&#xff0c;两个用户的公钥分别为…

全栈笔记_浏览器扩展篇(manifest.json文件介绍)

manifest.json介绍 是web扩展技术必不可少的插件配置文件,放在根目录作用: 指定插件的基本信息 name:名称manifest_version:manifest.json文件的版本号,可以写2或3version:版本description:描述定义插件的行为: browser_action:添加一个操作按钮到浏览器工具栏,点击按…

LeetCode 0103.二叉树的锯齿形层序遍历:层序遍历 + 适时翻转

【LetMeFly】103.二叉树的锯齿形层序遍历&#xff1a;层序遍历 适时翻转 力扣题目链接&#xff1a;https://leetcode.cn/problems/binary-tree-zigzag-level-order-traversal/ 给你二叉树的根节点 root &#xff0c;返回其节点值的 锯齿形层序遍历 。&#xff08;即先从左往…

关于C++中的深拷贝

说到深拷贝&#xff0c;是相对于浅拷贝而言的。弄清了浅拷贝&#xff0c;深拷贝也就不言自明了。对C初学者而言&#xff0c;所谓浅拷贝在编写程序过程中往往是无感的。我们一般在写一个类时&#xff0c;多数情况我们只是写了成员变量、成员函数&#xff0c;有时为了赋初值方便&…

Java与JavaScript同源不同性

Java是目前编程领域使用非常广泛的编程语言&#xff0c;相较于JavaScript&#xff0c;Java更被人们熟知。很多Java程序员想学门脚本语言&#xff0c;一看JavaScript和Java这么像&#xff0c;很有亲切感&#xff0c;那干脆就学它了&#xff0c;这也间接的帮助了JavaScript的发展…

HTML | DOM | 网页前端 | 常见HTML标签总结

文章目录 1.前端开发简单分类2.前端开发环境配置3.HTML的简单介绍4.常用的HTML标签介绍 1.前端开发简单分类 前端开发&#xff0c;这里是一个广义的概念&#xff0c;不单指网页开发&#xff0c;它的常见分类 网页开发&#xff1a;前端开发的主要领域&#xff0c;使用HTML、CS…