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

c语言—指针详解***内存地址***指针字节数***注意事项

创作不易,本篇文章如果帮助到了你,还请点赞支持一下♡>𖥦<)!! 

主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!

给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

目录

一、初步认识指针、内存地址的概念

1)内存地址

2)地址的相关运算

 二、指针变量

1)声明指针变量

 2)指针变量的字节数—根据操作系统的位数而不同

3)指针的移动

 三、多级指针

 四、指针注意事项

1)移动不越界

​2)定义指针不省 * 

3)初始空值可用NULL


一、初步认识指针、内存地址的概念

寻找地址的行为:想象成自己是快递小哥,送快递需要寻找地址,根据地址门牌号派送快递

类比到计算机寻找地址的过程,两个 编程思想:找地址,得空间! 

 

1)内存地址

内存地址即内存的地址,在创建变量时,计算机会分配一个内存空间用来存放变量,内存地址就是这个内存空间的地址,对每个字节来说都有自己的地址,在输出变量时,计算机就会找到这个变量的内存空间,从内存空间中取出变量。

可以将内存地址想象成我们居住的小区,住宅的最小单位是户(买房按户起卖,才不会卖几平米呢(╯°Д°)╯︵ ┻━┻),每户就是一个内存空间,每户都有门牌号,每户的门牌号就是内存空间的地址,门牌号具有唯一性,连续性,编号从小到大(101、102、201、202),内存地址也具有这些特征。(≧∇≦)ノ 很生动形象吧!

 理解了内存地址,就引入了新的概念——指针。指针就是地址!!!

2)地址的相关运算

&取变量所占字节的首地址;    * 根据地址取值  (&取地址 *对地址取空间)。

#include <stdio.h>
int main()
{//地址相关运算:&取变量所占字节的首地址  * 根据地址取值  (&取地址 *对地址取空间)int age = 65;printf("十六进制地址:%p 十进制地址:%d\n",&age,&age);printf("age = %d\n",age,*&age);//*和&优先级相同,结合方向从右向左 *&为互逆运算,结果仍为age(*& age)++;  //就是age++return 0;
}

注:由于++运算符的优先级比较高,(*& age)++中需要加(),否则会先计算age++ 

小提醒✿:在内存中存入的数据为16位哦~

 二、指针变量

1)声明指针变量

指针变量就是存储内存地址变量。

	//声明指针变量int a = 5;int* p;         //   *是指针的标志  int* 是一个组合类型——整型指针类型p = &a;         //   a的地址被 p指针变量保留:p指向了aprintf("p(地址):%p\n",p);a--;			// 利用指针对存储值进行算术运算(注意运算符的优先级)a *= 2;(*p)--;			//  a-- 和(*p)--相同      直接改变a为直接操作   通过*p取a空间改变a为间接操作//注:*和--优先级相同 需要()*p *= 2;

 2)指针变量的字节数—根据操作系统的位数而不同

#include <stdio.h>
int main()
{int a = 5;int* p;         //   *是指针的标志  int* 是一个组合类型——整型指针类型p = &a;         //   a的地址被 p指针变量保留:p指向了aprintf("p的字节数:%d int*的字节数:%d\n", sizeof(p), sizeof(int*) );char* pc;double* pd;unsigned long long* pull;printf("pc的字节数:%d char*的字节数:%d\n", sizeof(pc), sizeof(char*));printf("pd的字节数:%d double*的字节数:%d\n", sizeof(pd), sizeof(double*));printf("pull的字节数:%d unsigned long long*的字节数:%d\n", sizeof(pull),sizeof(unsigned long long*));printf("同一个操作系统中,不论什么类型的指针变量,所占字节都相同(不论什么样的车,车牌号都是5位)\n");printf("只要是指针变量类型,就占4(32位)/8字节(64位)(地址编号大小)\n");return 0;
}

无论什么类型的指针变量,所占字节长度是固定的,因为指针变量保留的是内存地址的编号,它只能随着32位系统或64位系统而不同 。32位就是用4个字节空间保留地址编号,64位就用8个字节空间保留地址编号。

 我们可以使用调试器进行观察:

 

3)指针的移动

     指针的移动:根据数据类型不同,移动的步伐大小也不同
    *p是一个计算过程 得到空间
    p负责找到首地址(开头的小地址)
    *负责:根据类型的字节数 获得空间使用权

#include <stdio.h>
int main()
{int a = 5;int* p;         //   *是指针的标志  int* 是一个组合类型——整型指针类型p = &a;         //   a的地址被 p指针变量保留:p指向了achar* pc = &a;double* pd = &a;unsigned long long* pull = &a;printf("类型不同,得到空间使用权大小不同:\n");printf("\t%d %d char* pc:%d个字节的空间使用权\n", sizeof(pc), sizeof(char*),sizeof(*pc) );  printf("\t%d %d double* pd:%d个字节的空间使用权\n", sizeof(pd), sizeof(double*), sizeof(*pd) );printf("\t%d %d unsigned long long* pull:%d个字节的空间使用权\n", sizeof(pull), sizeof(unsigned long long*), sizeof(*pull) );printf("类型不同,偏移的字节数不同:\n");printf("\tint* 4字节:%d %d %d %d\n",p-1,p,p+1,p+2);printf("\tchar* 1字节:%d %d %d %d\n",pc-1,pc,pc+1,pc+2);printf("\tdouble *8字节:%d %d %d %d\n",pd-1,pd,pd+1,pd+2);printf("\tunsigned long long* 8字节:%d %d %d %d\n",pull-1,pull,pull+1,pull+2);return 0;
}

 他们的开始地址都相同,由于数据类型的不同,偏移量不同 

 三、多级指针

多级指针又称为:指向指针的指针。 指针也是数据类型,也有他自己的内存地址,也有指向他的指针。       套娃呢搁这(*>.<*)

#include <stdio.h>
int main()
{/*多级指针又称为:指向指针的指针。*/int a = 100;int* p = &a;int** q = &p;//二级指针int*** z = &q;printf("%p %p %p\n",p,q,z);printf("%d\n",***z);return 0;
}
#include <stdio.h>
int main()
{   int a, b, c;//创建了3个int型变量int* p, q, k;//创建了一个指针变量 2个int型变量int* x, * y, * z;//创建了三个指针变量return 0;
}

 四、指针注意事项

1)移动不越界

指针不要位移到不属于本程序的内存空间,也不要利用指针改变不属于本程序内存空间的数据 

    int a = 5;int* p = &a;*p = 10;p += 10;//偏移10位:不属于自己空间*p = 8;int* q = (int*)0x5823682;*q = 8;

 2)定义指针不省 * 

声明多个指针变量类型时,*不能省略。

#include <stdio.h>
int main()
{int a, b, c;//创建了3个int型变量int* p, q, k;//创建了一个指针变量 2个int型变量int* x, * y, * z;//创建了三个指针变量return 0;
}

 调试器看一眼:

 y,z前没有* ,没有被当成指针变量

3)初始空值可用NULL

指针变量的初始值如果没有明确指向目标用NULL赋值

#include <stdio.h>
int main()
{int z = 0;double t = 0.0;int* x = NULL;//指针变量不确定指向哪个空间 建议用NULL设置:空地址return 0;
}

 

相关文章:

c语言—指针详解***内存地址***指针字节数***注意事项

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 给大家跳段街舞感谢支持&#xff01;ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ…...

VMware虚拟机之WindowsXP系统超详细下载安装与使用教程

文章目录前言一、WindowsXP虚拟机系统下载二、WindowsXP虚拟机系统安装三、WindowsXP虚拟机系统使用总结前言 本博客的主要内容为使用VMware虚拟机下载安装与使用WindowsXP系统&#xff0c;WindowsXP系统虽然早已过时&#xff0c;但是仍对我们的学习有着很大的帮助&#xff0c;…...

【VMD-SSA-LSSVM】基于变分模态分解与麻雀优化Lssvm的负荷预测【多变量】(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

积极心态,助力人生成功

无论生活中遇到多少困难和挫折&#xff0c;只要我们保持积极心态、努力拼搏&#xff0c;就有望最终实现自己的梦想和目标。...

ADRC线性跟踪微分器(ST+SCL语言)

ADRC自抗扰相关算法源代码和公式请参看下面文章链接: ADRC/Matlab一步步实现跟踪微分器TD(附完整PLC测试代码链接)_ladrc线性跟踪微分器差分方程_RXXW_Dor的博客-CSDN博客关于Adrc的理论分析不是本篇博客的重点,主要也是能力所限,相关理论大家可以看韩京清教授的论文,专栏…...

Linux C/C++ 崩溃诊断大师:解锁软件问题定位与修复的秘密武器

让崩溃成为历史&#xff1a;详解有效诊断与解决技巧引言崩溃信息的类型设置信号处理函数&#xff08;Setting up signal handlers&#xff09;信号来源和上下文信息使用 siginfo_t 结构体获取信号来源信息使用 ucontext 结构体获取上下文信息将崩溃信息写入日志标准的信号处理函…...

ChatGPT能代替Oracle DBA吗?用Oracle OCP(1z0-083)的真题测试一下。

让我们来看看ChatGPT不能通过Oracle OCP的考试&#xff1f; 文章目录引言测试过程总结和分析关于博主&#xff0c;姚远&#xff1a;Oracle ACE&#xff08;Oracle和MySQL数据库方向&#xff09;。Oracle MAA 大师。华为云MVP。《MySQL 8.0运维与优化》的作者。拥有 Oracle 10g和…...

《扬帆优配》二季度投资策略出炉 机构调仓换股露踪迹

随着多家上市公司公告发布&#xff0c;其发表的股东数据使得基金的最新持仓浮出水面。与此同时&#xff0c;组织也在密集调研中寻觅出资时机。站在二季度的起点&#xff0c;基金公司二季度出资策略渐次发表。多家基金公司以为&#xff0c;宏观经济将延续修正态势&#xff0c;仍…...

【SpringMVC】2—传统方式实现增删改查

⭐⭐⭐⭐⭐⭐ Github主页&#x1f449;https://github.com/A-BigTree 笔记链接&#x1f449;https://github.com/A-BigTree/Code_Learning ⭐⭐⭐⭐⭐⭐ 如果可以&#xff0c;麻烦各位看官顺手点个star~&#x1f60a; 如果文章对你有所帮助&#xff0c;可以点赞&#x1f44d;…...

图像阈值化

图像阈值化 图像阈值化简介 ⚫ 图像阈值化是图像处理的重要基础部分, 应用很广泛, 可以根据灰度差异来分割图像不同部分 ⚫ 阈值化处理的图像一般为单通道图像(灰度图) ⚫ 阈值化参数的设置可以使用滑动条来debug ⚫ 阈值化处理易光照影响, 处理时应注意 ⚫ 本节主要介绍…...

1.5 极限运算法则

思维导图&#xff1a; 我的理解&#xff1a; 如果一个数列{a_n}是一个无穷小&#xff0c;那么它的极限为0&#xff0c;即lim(n→∞)a_n0。同样地&#xff0c;如果另一个数列{b_n}也是一个无穷小&#xff0c;那么它的极限为0&#xff0c;即lim(n→∞)b_n0。 当我们考虑这两个无…...

首批因AI失业的人出现-某游戏公司裁掉半数原画师

如今各种AI爆火&#xff0c;不可避免的的会与某些功能撞车职业发生冲突&#xff0c;每一次生产力的变革&#xff0c;在带来技术进步与更高效率的同时&#xff0c;也都无可避免的会带来一波失业浪潮&#xff0c;当下的人工智能浪潮自然也不例外。 现在&#xff0c;第一批因为AI…...

字符串转换整数(atoi)

请你来实现一个 myAtoi(string s) 函数&#xff0c;使其能将字符串转换成一个 32 位有符号整数&#xff08;类似 C/C 中的 atoi 函数&#xff09;。 函数 myAtoi(string s) 的算法如下&#xff1a; 读入字符串并丢弃无用的前导空格 检查下一个字符&#xff08;假设还未到字符…...

Servlet练习

练习准备 编写Student和StudentDao package beans;public class Student{private String num;private String name;public Student(){}public String getNum() {return num;}public String getName() {return name;}public void setNum(String num) {this.num num;}public v…...

美国高速公路信号灯控制项目的大致逻辑和步骤 智慧公路设计

美国高速公路信号灯控制项目的大致逻辑和步骤&#xff1a; 美国那边先提供一个关于具体做什么需求、那边的设备&#xff08;信号灯&#xff09;有什么参数&#xff0c;什么接口&#xff0c;分别是什么属性等等的详细设计文档&#xff0c;开发人员拿到这个文档以后把它看懂&…...

数字电源专用IC,国产C2000, QX320F280049

一、特性参数 1、独立双核&#xff0c;32位CPU&#xff0c;单核主频400MHz 2、IEEE 754 单精度浮点单元 &#xff08;FPU&#xff09; 3、三角函数单元 &#xff08;TMU&#xff09; 4、1MB 的 FLASH &#xff08;ECC保护&#xff09; 5、1MB 的 SRAM &#xff08;ECC保护&…...

第六章 ARM汇编语言程序设计【嵌入式系统】

第六章 ARM汇编语言程序设计【嵌入式系统】前言推荐第六章 ARM汇编语言程序设计6.1 概述6.2 ARM汇编语言指示符6.3 ARM编程举例6.4 ARM过程调用6.5 典型举例6.6 内嵌汇编C与汇编相互调用最后前言 以下内容源自《【嵌入式系统】》 仅供学习交流使用 推荐 无 第六章 ARM汇编语…...

详细讲讲Java线程的状态

TERMINATED状态 是什么状态&#xff1f; 在Java线程的生命周期中&#xff0c;TERMINATED状态是线程的最终状态&#xff0c;表示线程已经执行完毕并已经退出。当一个线程完成了它的工作&#xff0c;或者因为异常而提前结束时&#xff0c;它会进入TERMINATED状态。此时线程不再执…...

企业月结快递管理教程

回答这个问题的之前&#xff0c;我们先来看看什么是企业月结快递管理...... 经济的发展&#xff0c;技术的进步&#xff0c;电商行业的加持之下&#xff0c;这几年快递行业的发展有目共睹。不仅是我们的生活离不开快递&#xff0c;很多企业的运作多多少少也离不开“快递”二字…...

cm cdp告警 Swap Memory Usage Suppress...

原因&#xff1a;服务器没有关swap&#xff0c;服务使用了swap 在cdp集群中&#xff0c;一般要关掉swap&#xff0c;如果没有关。可以使用 下面命令设置程序尽可能不使用swap&#xff0c;使用swap会影响性能 修改后&#xff0c;重启服务就不会使用swap了 sysctl -w vm.swappi…...

设备管理系统是什么?如何建立设备管理体系?

在现代企业的运转中&#xff0c;生产设备无疑是核心资产。无论是制造业的数控机床&#xff0c;还是建筑工地的重型机械&#xff0c;甚至是医疗机构的精密仪器&#xff0c;设备的稳定运行直接决定了企业的生产效率、产品质量和成本控制。然而&#xff0c;许多企业在设备管理上仍…...

ARL灯塔扫不出指纹?手把手教你用Python脚本批量导入指纹库,提升资产识别准确率

ARL灯塔指纹识别优化实战&#xff1a;Python脚本批量导入与精准率提升指南 资产侦察灯塔&#xff08;ARL&#xff09;作为渗透测试领域的重要工具&#xff0c;其核心价值在于准确识别目标资产的技术特征。然而许多中级用户发现&#xff0c;默认指纹库在面对特定行业或新型资产…...

用Simulink+Carsim复现论文:四轮转向后轮控制5种算法对比(附模型下载)

用SimulinkCarsim复现论文&#xff1a;四轮转向后轮控制5种算法对比&#xff08;附模型下载&#xff09; 在车辆动力学与控制领域&#xff0c;四轮转向技术正逐渐从豪华车型向主流市场渗透。不同于传统的前轮转向系统&#xff0c;四轮转向通过后轮主动参与转向&#xff0c;显著…...

Windows环境下ODBC连接MySQL保姆级教程(含性能优化配置)

Windows环境下ODBC连接MySQL全流程实战指南 1. 环境准备与驱动安装 在Windows平台使用ODBC连接MySQL数据库&#xff0c;首先需要确保开发环境配置正确。与JDBC不同&#xff0c;ODBC作为跨语言的数据库连接标准&#xff0c;其驱动安装过程需要特别注意版本兼容性问题。以下是环境…...

OpenJSCAD.org与3D打印完美结合:从代码到实物的完整工作流程

OpenJSCAD.org与3D打印完美结合&#xff1a;从代码到实物的完整工作流程 【免费下载链接】OpenJSCAD.org JSCAD is an open source set of modular, browser and command line tools for creating parametric 2D and 3D designs with JavaScript code. It provides a quick, pr…...

Claude Code 源码泄露深度剖析,Anthropic AI 编程助手的架构全解密

2026年3月31日&#xff0c;整个AI开发圈被一条消息炸开了锅。安全研究员Chaofan Shou&#xff08;推特账号Fried_rice&#xff09;在Anthropic官方发布的npm包中&#xff0c;意外发现了一个暴露的.map文件&#xff0c;正是这个看似不起眼的文件&#xff0c;直接泄露了Claude Co…...

解决Legado书源调试难题:从问题诊断到环境优化的完整指南

解决Legado书源调试难题&#xff1a;从问题诊断到环境优化的完整指南 【免费下载链接】legado Legado 3.0 Book Reader with powerful controls & full functions❤️阅读3.0, 阅读是一款可以自定义来源阅读网络内容的工具&#xff0c;为广大网络文学爱好者提供一种方便、快…...

2026届学术党必备的十大AI辅助写作助手解析与推荐

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek “降AI”是要借助技术手段&#xff0c;去降低文本里人工智能生成内容的可识别程度&#xff0…...

用Python和Geogebra手把手复现阿克曼转向模型(附完整代码与可视化)

用Python和Geogebra手把手复现阿克曼转向模型&#xff08;附完整代码与可视化&#xff09; 在自动驾驶和机器人领域&#xff0c;理解车辆如何转向是基础中的基础。但当你第一次看到那些复杂的公式时&#xff0c;是不是感觉像在看天书&#xff1f;别担心&#xff0c;今天我们就用…...

NoSleep防休眠工具:系统唤醒与持续运行的高效解决方案

NoSleep防休眠工具&#xff1a;系统唤醒与持续运行的高效解决方案 【免费下载链接】NoSleep Lightweight Windows utility to prevent screen locking 项目地址: https://gitcode.com/gh_mirrors/nos/NoSleep 在数字化工作环境中&#xff0c;电脑意外休眠往往导致工作中…...