拿捏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,但此地址无法使用,读写地址会报错
相关文章:
拿捏c语言指针(上)
目录 前言 编辑 指针 内存与地址 计算机常见单位 理解编址 取地址,指针变量,解引用 取地址 指针变量 解引用 指针变量大小 指针类型的作用 char*解引用后 指针-整数 应用 void*指针 const修饰指针变量 const修饰普通变量 const修饰指…...
JVM指令手册
栈和局部变量操作将常量压入栈的指令 aconst_null 将null对象引用压入栈 iconst_m1 将int类型常量-1压入栈 iconst_0 将int类型常量0压入栈 iconst_1 将int类型常量1压入操作数栈 iconst_2 将int类型常量2压入栈 iconst_3 将int类型常量3压入栈 iconst_4 将int类型常量4…...
Linux之多线程
目录 一、进程与线程 1.1 进程的概念 1.2 线程的概念 1.3 线程的优点 1.4 线程的缺点 1.5 线程异常 1.6 线程用途 二、线程控制 2.1 POSIX线程库 2.2 创建一个新的线程 2.3 线程ID及进程地址空间布局 2.4 线程终止 2.5 线程等待 2.6 线程分离 一、进程与线程 在…...
TestNG invocationCount属性
有时我们会遇到这样的问题,比如如何多次运行一个测试用例?invocationCount是这个问题的答案。在这篇文章中,我们将讨论在TestNG中与Test annotation一起使用的invocationCount属性。 这个属性有什么作用,或者调用计数有什么用&am…...
关于maven项目中无法通过邮件服务器发送邮件的补充解决方案
1、问题及解决方法 我的一篇文章中提到使用代码发送电子邮件,但是maven项目中无法执行成功,现在我找到了解决办法,只要引入依赖时同时引入下面两个依赖就行了,我无法找到原因主要是使用单元测试方法运行,它居然不报错&…...
树形dp 笔记
树的最长路径 给定一棵树,树中包含 n 个结点(编号1~n)和 n−1 条无向边,每条边都有一个权值。 现在请你找到树中的一条最长路径。 换句话说,要找到一条路径,使得使得路径两端的点的距离最远。 注意&…...
2024-02-08 Unity 编辑器开发之编辑器拓展1 —— 自定义菜单栏
文章目录 1 特殊文件夹 Editor2 在 Unity 菜单栏中添加自定义页签3 在 Hierarchy 窗口中添加自定义页签4 在 Project 窗口中添加自定义页签5 在菜单栏的 Component 菜单添加脚本6 在 Inspector 为脚本右键添加菜单7 加入快捷键8 小结 1 特殊文件夹 Editor Editor 文件夹是 …...
typescript中的Omit排除类型及Pick取想要的属性
Omit 的使用:排除类型 type OmitUser {name: string,age: number,sex:string } type newOmit Omit<OmitUser, sex>// 定义一个对象并将其类型设置为 newOmit const example: newOmit {name: "John",age: 30 };console.log( Omit 的使用:排除类型 , example…...
MATLAB计算极限和微积分
一.函数与极限 计算极限:lim(3*x^2/(2x1)),x分别趋于0和1,代码如下: syms x; limit(3*x*x/(2*x1),x,0) limit(3*x*x/(2*x1),x,1) 结果分别为0和1: 1.计算双侧极限 计算极限:lim(3*x^2/(2x1))࿰…...
在数组中插入元素
问题:假设有一个数组{1,2,3,4,5},如果我们要在3之后插入一个数(520),这该怎么办呢? 思路:要想在以元素3之后插入一个元素,我们先要做…...
【计算机网络】物理层|传输介质|物理层设备|宽带接入技术
目录 一、思维导图 二、传输介质 1.传输介质——导引型 2.传输介质——非导引型编辑 三、物理层设备 1.物理层设备:中继器&集线器 2.宽带接入技术(有线) 编辑 四、趁热打铁☞习题训练 五、物理层总思维导图 推荐 前些天发现…...
TCP和UDP面试题提问
TOC TCP(传输控制协议)和UDP(用户数据报协议)是两种计算机网络通信协议,它们在网络通信中起着不同的作用。 TCP TCP 是面向连接的协议,它在数据传输之前需要在发送端和接收端建立一条连接。TCP 提供可靠…...
网安常用的三个攻击方式
1.渗透测试执行标准(PTES) 渗透测试执行标准由7个部分组成,包括前期交互、情报收集、威胁建模、漏洞分析、渗透利用、后渗透、撰写报告。在中国,渗透测试必须经过授权,否则就违背了网络安全法。前期交互主要指开展渗透…...
C++面向对象程序设计-北京大学-郭炜【课程笔记(二)】
C面向对象程序设计-北京大学-郭炜【课程笔记(二)】 1、结构化程序设计结构化程序设计的不足 2、面向对象的程序设计2.1、面向对象的程序设计2.2、从客观事物抽象出类2.3、对象的内存分配2.4、对象之间的运算2.5、使用类的成员变量和成员函数用法1&#x…...
IDEA Ultimate下载(采用JetBrain学生认证)
IDEA Ultimate版本下载 Ulitmate是无限制版(解锁所有插件,正版需要付费。学生可以免费申请许可)Community是开源社区版本(部分插件不提供使用,比如Tomcat插件。免费) 我们将通过学生认证获取免费版。 Je…...
Matplotlib plt.plot数据可视化应用案例
Matplotlib 是 Python 中一个非常流行的绘图库,它允许用户创建各种静态、动态、交互式的图表和可视化。plt.plot() 是 Matplotlib 中用于绘制二维数据的基本函数。 下面是一个使用 plt.plot() 的简单数据可视化应用案例: 案例:绘制正弦和余…...
ES实战--集群扩展
查看ES集群状态: GET /_cluster/health?prettytrue当一个节点加入集群的时候,ES会自动地尝试将分片在所有节点上进行均匀分配. 如果更多的节点加入集群,ES将试图在所有节点上均匀分配分片数量.这样每一个新加入的节点都能通过部分数据来分担负载 第二个节点发现第一个节点,并…...
【重要】django默认生成的表的意思记录
accounts_userprofile: 这是与用户相关的个人资料表,通常包含用户的额外信息,比如头像、个人描述等。 accounts_userprofile_groups: 这是用户个人资料和用户组之间的关联表,用于记录用户属于哪些用户组。 accounts_userprofile_user_permiss…...
12.3 OpenGL顶点后处理:平面着色
平面着色 Flatshading Flat shading (平面着色)是一种简化渲染技术,它在光栅化阶段将一个图元(primitive)的所有顶点赋予相同的颜色或其它输出变量的值。这些赋予的值来自于该图元的“引发顶点”(provoking vertex)。…...
实验5-6 使用函数判断完全平方数
本题要求实现一个判断整数是否为完全平方数的简单函数。 函数接口定义: int IsSquare( int n ); 其中n是用户传入的参数,在长整型范围内。如果n是完全平方数,则函数IsSquare必须返回1,否则返回0。 裁判测试程序样例࿱…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...
tauri项目,如何在rust端读取电脑环境变量
如果想在前端通过调用来获取环境变量的值,可以通过标准的依赖: std::env::var(name).ok() 想在前端通过调用来获取,可以写一个command函数: #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...
pycharm 设置环境出错
pycharm 设置环境出错 pycharm 新建项目,设置虚拟环境,出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...
Linux基础开发工具——vim工具
文章目录 vim工具什么是vimvim的多模式和使用vim的基础模式vim的三种基础模式三种模式的初步了解 常用模式的详细讲解插入模式命令模式模式转化光标的移动文本的编辑 底行模式替换模式视图模式总结 使用vim的小技巧vim的配置(了解) vim工具 本文章仍然是继续讲解Linux系统下的…...
高效的后台管理系统——可进行二次开发
随着互联网技术的迅猛发展,企业的数字化管理变得愈加重要。后台管理系统作为数据存储与业务管理的核心,成为了现代企业不可或缺的一部分。今天我们要介绍的是一款名为 若依后台管理框架 的系统,它不仅支持跨平台应用,还能提供丰富…...

