当前位置: 首页 > news >正文

【C语言】走进指针世界(下卷)

前言

在“走进指针世界(上卷)”中,我们已经说过:什么是指针、内存和地址,指针的使用、声明、初始化,取地址运算符、解引用运算符以及这两者关系,还有指针赋值。

在正式使用指针进行各种代码的编写之前,在这篇“走进指针世界(下卷)”里,让我们再了解一些指针的重要的前置知识吧。

指针变量的大小

指针变量有大小吗? 答案是有的。我们知道,sizeof是一个操作符, 其作用是返回一个对象或类型所占的内存字节数。就像整型变量、字符型变量等可以用sizeof计算大小一样,指针变量也可以这样计算大小:

#include<stdio.h>int main()
{int a = 10;int* p = &a;printf("%zd\n", sizeof(p));return 0;
}

在vs2022的x86(32位环境)下我们可以得出这样的运行结果:

如果改成x64(64位环境),就是这样的运行结果:

 所以我们知道指针变量p的大小就是4或8个字节。

指针变量大小与指向类型的关系:

p是指向整型变量的指针变量,那指向字符型变量的指针变量有多大呢?我们可以再用同样的方式进行观察:

char a = 'a';
char* p = &a;
printf("%zd\n", sizeof(p));
return 0;

x86(32位环境)下结果:

x64(64位环境)下结果:

可以看到指向字符型变量的指针变量的大小同样是4或8个字节。我们可以继续去观察指向其他类型变量的指针变量的大小,最终会发现都是4或8个字节(取决于环境)

为什么呢?

明白这个问题我们必须知道地址是怎么产生的。

计算机中的编址,是通过硬件设计完成的。

计算机中有很多的硬件单元,硬件单元之间互相协同工作,而协同工作需要相互之间能够进行数据传递。硬件之间相互独立,它们的通信方式是用“线”连起来。CPU和内存之间有大量的数据交互,所以这两者也用线连起来。

32位机器有32根地址总线,每根线只有两态,表示为0或1(电脉冲有无),那么一根线可以表示两种含义,32根线就可以表示2^32种含义,每种含义可以表示一个地址。

既然把32根地址线产生的2进制序列当作一个地址,那么一个地址就是32个bit位,需要4个字节来存储。所以,指针变量的大小就是4个字节。 

在这个分析的过程中,我们可以看出,指针变量的大小与该指针指向的数据类型确实是无关的,只与是32位环境还是64位环境有关。

指针变量类型的意义

既然指针变量的大小都是4或8个字节,那么你可能会好奇指针变量类型的意义在哪呢?现在我们就来了解一下指针变量类型的意义。

对于解引用的意义:

第一个方面的意义在于解引用,指针类型的意义决定了在对指针解引用时有多大的权限,或者说一次能操作几个字节

*pa=0之后: 

从内存窗口我们可以看出,在对指向int类型的指针变量pa解引用并赋值0时,我们把4个字节(00为一个字节)都该为了0。

如果将同样的动作施加于一个指向char类型的指针变量,会发生什么?

*pa=0之后:  

可以看到,我们只能操作一个字节。

 所以当指针变量指向的类型不同,即指针变量的类型也不同时,解引用的权限可能是不同的。

对于指针加减整数的意义:

指针变量的类型还决定了指针加减一个整数时,实际移动的字节数。或者通俗点说,指针向前或向后走一步有多大距离。

我们在vs的x86下,用%p打印观察地址。发现同一个整型变量,我们用两个不同类型的指针存储它的地址,在加1后地址的变化不相同。我们知道一个内存单元为1个字节,每个字节有自己的编号即地址,所以pa+1加了4个字节,而pc+1加了1个字节。

其实,pa+1时,加的并不是整数1,而是1*sizeof(int),pc+1时,加的是1*sizeof(char)。 

void*指针

有一种特殊的指针类型,void*指针,也就是无具体类型的指针,也叫泛型指针。

这种指针有其优缺点。

优点: 

它的优点就是既然是泛型指针,在接收一个地址的时候无需局限于某个类型的地址,可以把任意类型数据的地址交给它。比如下面这个代码是合法的:

int a = 10;
void* p = &a;

当我们遇到不知道具体类型的地址又需要用指针存储时,void*指针就可以派上用场。

缺点:

但是它也有自己的缺点,就是无法直接进行指针的加减整

数运算和解引用运算,因为它不知道要操作几个字节。

int a = 10;
void* p = &a;
printf("%d\n", *p);//会报错

const修饰指针

有时,我们不希望指针指向的内容被修改,那么我们就可以使用const对其进行修饰。

还记得const的用法吗?

int a = 100;
a = 200;

在这个代码中,我们把a的值改变了。

​
const int a = 100;
a = 200;//会报错

而我们用const修饰变量a时,a变成了“常变量”,本质上还是个变量,但是不能被修改。

那么现在我们再看一个代码:

我们用const修饰变量n的声明时,我们本意是希望n的值不会被修改,而通过指针我们却间接改掉了变量n的值,那么我们怎样才能达到我们的预期呢?

 

当我们在指针变量p的声明时用cconst进行修饰,就无法再通过刚才的方式修改n的值,而是会报错了。

const与*的前后关系

 在声明一个指针变量并想要用const进行修饰时,我们需要注意的一点是const和*的先后关系。因为当const放在*前面时,无法被修改的是指针指向的内容,当const放在*后面时,无法改变的是指针的指向:

注意,const放在*前面时,在int前还是后都是一样的效果:

 

而当const放在*后面时,才会有根本的改变:

还有一种情况,当我们在*的前后都放上const,那就变成了指向和指向的内容都无法修改:

 

总之,可以根据我们不希望被修改的内容来决定const的用法,并且在需要使用const的时候不要吝啬使用,因为它可以在我们不小心修改了不应该修改的内容时及时给出警告。 

那么,到此为止,“走进指针世界”就结束了,后面我还会持续更新指针相关的更多内容,希望大家发现错误可以向我指正^_^

相关文章:

【C语言】走进指针世界(下卷)

前言 在“走进指针世界&#xff08;上卷&#xff09;”中&#xff0c;我们已经说过&#xff1a;什么是指针、内存和地址&#xff0c;指针的使用、声明、初始化&#xff0c;取地址运算符、解引用运算符以及这两者关系&#xff0c;还有指针赋值。 在正式使用指针进行各种代码的…...

【Spring】SSM整合_入门代码实现

1. Maven依赖 在pom.xml中添加SSM框架的依赖 <!-- Spring Core --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.x</version> </dependency>…...

C++代码错误解决1(函数模板)

1、代码如下 //示例函数模板的使用 #include <iostream> #include <string> using namespace std; template <typename T>//函数模板 T max(T a,T b) {return a>b?a:b; } int main() {int a,b;cout<<"input two integers to a&b:"…...

idea configuration 配置 方便本地启动环境切换

idea 再项目启动的时候避免切换环境导致上线的时候出现环境配置问题 可以再idea 的 configuration 中配置项目的 vm options 虚拟机的内容占用 -Xmx256m -Xms256m -Xmn100m -Xss256k program arguments properties 文件中需要修改的配置参数 active profiles 指定启动的本…...

win10配置wsl的深度学习环境

# 1、一步完成wsl&#xff1a;开启虚拟机、linux子系统、并下载ubuntu # 官方文档: https://learn.microsoft.com/zh-cn/windows/wsl/install wsl --install# 2、打开windows terminal&#xff0c;选ubuntu交互环境 # 第一次需要配置用户名和密码 # 接下来正常使用即可# 3、cud…...

如何处理时间序列的缺失数据

您是否应该删除、插入或估算&#xff1f; 世界上没有完美的数据集。每个数据科学家在数据探索过程中都会有这样的感觉&#xff1a; df.info()看到类似这样的内容&#xff1a; 大多数 ML 模型无法处理 NaN 或空值&#xff0c;因此如果您的特征或目标包含这些值&#xff0c;则在…...

fastapi中实现多个路由请求

大家伙&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。 前言 最近在写机器人相关的接口&#xff0c;顺手学了学python&#xff0c;发现这是个好东西&#xff0c;写代码效率比java要高很多&#xff0c;比如写个词云呀&#xff0c;写个回调呀&am…...

前端框架选择指南:React vs Vue vs Angular

选择前端框架时&#xff0c;React、Vue 和 Angular 都是流行的选择&#xff0c;各有优缺点。我们可以从各个维度进行比较和选择&#xff1a; React 核心理念&#xff1a; 组件化开发&#xff0c;专注于视图层。学习曲线&#xff1a; 相对平缓&#xff0c;因为重点在于JSX和组…...

猫头虎 解析:为什么AIGC在国内适合做TOB,在国外适合做TOC?

猫头虎 解析&#xff1a;为什么AIGC在国内适合做TOB&#xff0c;在国外适合做TOC&#xff1f; 博主 猫头虎 的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面…...

并发编程笔记8--ThreadLocal结构详解

ThreadLocal&#xff0c;即线程变量&#xff0c;是一个以ThreadLocal对象为键&#xff0c;任意对象为值的存储结构。这个结构被附带在线程上&#xff0c;也就是说一个线程可以根据一个ThreadLocal对象查询到绑定在这个线程上的值。可以通过set(T)方法来设置一个值&#xff0c;在…...

强烈推荐 20.7k Star!企业级商城开源项目强烈推荐!基于DDD领域驱动设计模型,助您快速掌握技术奥秘,实现业务快速增长

更多资源请关注纽扣编程微信公众号 1 项目简介 商城是个从零到一的C端商城项目&#xff0c;包含商城核心业务和基础架构两大模块,推出用户、消息、商品、订单、优惠券、支付、网关、购物车等业务模块&#xff0c;通过商城系统中复杂场景&#xff0c;给出对应解决方案。使用 …...

【C++STL详解(四)------vector的模拟实现】

文章目录 vector各函数接口总览vector当中的成员变量介绍默认成员函数构造函数1构造函数2构造函数3拷贝构造函数赋值运算符重载函数析构函数 迭代器相关函数begin和end 容量和大小相关函数size和capacityreserveresizeempty 修改容器内容相关函数push_backpop_backinserterases…...

租赁系统|北京租赁系统|租赁软件开发流程

在数字化时代的浪潮下&#xff0c;小程序成为了各行各业争相探索的新领域。租赁行业亦不例外&#xff0c;租赁小程序的开发不仅提升了用户体验&#xff0c;更为商家带来了更多商业机会。本文将详细解析租赁小程序的开发流程&#xff0c;为有志于进军小程序领域的租赁行业从业者…...

JAVA面试题大全(十四)

1、Kafka 可以脱离 Zookeeper 单独使用吗&#xff1f;为什么&#xff1f; kafka不能脱离zookper单独使用&#xff0c;因为kafka使用zookper管理和协调kafka的节点服务器。 2、Kafka 有几种数据保留的策略&#xff1f; Kafka提供了多种数据保留策略&#xff0c;这些策略用于定…...

Web Accessibility基础:构建无障碍的前端应用

Web Accessibility&#xff08;网络无障碍&#xff09;是确保所有人都能平等访问和使用网站和应用程序的关键。这包括视觉、听觉、运动和认知能力有限的用户。以下是一些构建无障碍前端应用的基础原则和代码示例&#xff1a; 2500G计算机入门到高级架构师开发资料超级大礼包免…...

谈谈你对 SPA 的理解?

1 理解基本概念 SPA&#xff08;single-page application&#xff09;单页应用&#xff0c;默认情况下我们编写 Vue、React 都只有一个html 页面&#xff0c;并且提供一个挂载点&#xff0c;最终打包后会再此页面中引入对应的资源。&#xff08;页面的渲染全部是由 JS 动态进行…...

JAVA给一个JSON数组添加对象

操作Mysql表的json字段&#xff0c;查询json字段的内容&#xff0c;将新增的内容添加到查询的json数组中 String a "[{\"name\": \"张三\", \"age\": 10, \"gender\": \"男\", \"email\": \"123qq.co…...

设计一个完美的用户角色权限表

设计一个完美的用户角色权限表需要考虑系统的安全性、灵活性和可扩展性。以下是一个详细的用户角色权限管理表设计方案&#xff0c;包含多个表结构和字段描述。 目录 1. 用户表&#xff08;Users Table&#xff09;2. 角色表&#xff08;Roles Table&#xff09;3. 权限表&…...

Git 基本使用

目录 Git 安装与设置 在 Windows上安装 Git git 的配置 Git 原理 git 的四个区域 git 工作流程 git 文件的状态 Git 操作 创建仓库 免密登录 基本操作 版本回退 本地仓库整理 分支命令 合并分支 解决冲突 Git 安装与设置 在 Windows上安装 Git 在 Windows上使…...

LabVIEW使用PID 控制器有哪些应用场景?

如何在LabVIEW中创建PID控制器? LabVIEW为各种控制工程任务提供了内置函数和库&#xff0c;包括PID控制器编程。这些功能位于控制设计和仿真调色板中&#xff0c;其中有用于不同类型控制器的子调色板。要在LabVIEW中创建PID控制器&#xff0c;需要将PID函数从PID子调色板拖放…...

Hitboxer:开源SOCD清理工具,3分钟提升游戏操作精准度

Hitboxer&#xff1a;开源SOCD清理工具&#xff0c;3分钟提升游戏操作精准度 【免费下载链接】socd Key remapper for epic gamers 项目地址: https://gitcode.com/gh_mirrors/so/socd 你是否在激烈的游戏对抗中经历过这样的挫败&#xff1a;同时按下左右方向键时角色卡…...

别再手动点菜单了!用这招让Cadence Virtuoso Schematic效率翻倍(附Net高亮快捷键配置)

电路设计效率革命&#xff1a;Cadence Virtuoso Schematic高阶快捷键配置指南 在集成电路设计的浩瀚宇宙中&#xff0c;Cadence Virtuoso如同设计师手中的光刻机&#xff0c;每一次精准操作都直接影响最终芯片的性能与可靠性。然而&#xff0c;当面对数百个晶体管组成的复杂模…...

Burp Suite深度解析:从流量抓包到业务逻辑漏洞挖掘

1. 这不是“学个插件”——Burp Suite 是渗透测试的呼吸系统 很多人第一次听说 Burp Suite&#xff0c;是在某篇“三步拿下登录框”的速成教程里&#xff1a;装好Java、拖进浏览器代理、点几下Repeater就弹出密码明文。结果真去测一个中型SaaS后台&#xff0c;不到十分钟就卡在…...

pan-baidu-download:百度网盘多线程下载加速器架构解析与性能优化指南

pan-baidu-download&#xff1a;百度网盘多线程下载加速器架构解析与性能优化指南 【免费下载链接】pan-baidu-download 百度网盘下载脚本 项目地址: https://gitcode.com/gh_mirrors/pa/pan-baidu-download pan-baidu-download是一款基于Python开发的百度网盘命令行下载…...

2026年一键生成论文工具对比实测:5款神器从选题到格式全流程护航

写论文的焦虑&#xff0c;是每个科研人和学生都心照不宣的“隐形压力”。选题无从下手&#xff0c;文献检索耗时费力&#xff0c;逻辑框架反复推翻&#xff0c;格式排版让人抓狂&#xff0c;查重降重更是像在和系统玩“猫鼠游戏”。2026年的AI工具早已不是过去那种“打字机”&a…...

【与我学 ClaudeCode】协作篇 之 Worktree + Task Isolation :目录隔离的并行执行通道

作者&#xff1a;逆境不可逃 技术永无止境 希望我的内容可以帮助到你&#xff01;&#xff01;&#xff01;&#xff01; 大家吼 ! 我是 逆境不可逃 今天给大家带来文章《【与我学 ClaudeCode】协作篇 之 Worktree Task Isolation &#xff1a;目录隔离的并行执行通道》. Le…...

DIY四路自动音频源切换器:从信号检测到继电器隔离的完整设计

1. 项目概述与核心需求解析作为一个喜欢在工作室里捣鼓各种音频设备的玩家&#xff0c;我经常遇到一个挺烦人的问题&#xff1a;我的功放只有一组输入&#xff0c;但我想接的设备却有好几个——台式电脑、平板、蓝牙接收模块&#xff0c;还有一台树莓派。每次想切换音源&#x…...

2026这6款神级降AIGC平台大公开,一键让AIGC率直逼绝对安全线!

步入 2026 年&#xff0c;学术圈的风向早已不是从前的模样。曾经大家还在为查重率发愁&#xff0c;如今却陷入了更棘手的困境——如何在不破坏论文专业性的前提下&#xff0c;彻底消除 AI 痕迹&#xff1f;随着 AIGC 检测技术不断进化&#xff0c;高校对论文的审核标准也愈发严…...

基于MAX78000的边缘AI语音识别:从模型训练到嵌入式部署实战

1. 项目概述与核心思路最近在捣鼓一个挺有意思的小项目&#xff0c;我把它叫做“声控转向控制器”。简单来说&#xff0c;这玩意儿能听懂你说的几个特定单词&#xff0c;比如“左转”、“右转”、“前进”、“后退”&#xff0c;然后控制对应的LED灯亮起。你可能会想&#xff0…...

【小白快速上手】 OpenClaw 安装部署全流程(含安装包)

OpenClaw 一键安装包&#xff5c;一键部署&#xff0c;告别复杂环境配置 适配系统&#xff1a;Windows10/11 64 位当前版本&#xff1a;v2.7.5&#xff08;虾壳云版&#xff09;核心优势&#xff1a;全程可视化操作&#xff0c;无需命令行、无需手动配置 Python/Node.js&#…...