从C出发 26 --- 指针 : 一种特殊的变量

news2024/11/18 9:23:13

指针是变量, 是特殊的变量

在计算机内部逻辑上是一个一个存储单元,每个存储单元是一个字节

8 G  /16 G 表示的是存储单元的数量

如果要确定某一个具体的存储单元,要怎么办?

可以编号,这里的 0 1 2 3 指的就是内存地址,内存地址指的就是存储单元的编号,每一个字节有一个编号,这个编号就是内存地址

内存地址是什么?  

是编号,显然就是一个整型数了


内存由一个一个存储单元组成,这些存储单元的单位是什么? 是字节 

这个整型变量占用了 4 个字节 ,这个整型变量的名字叫 var ,换句话说 var 就代表了这4个字节

除了使用定义的名字来访问这4个字节,还有没有别的办法来访问这 4个字节  通过内存地址

结论 :  在程序中除了可以通过变量名来具体的访问一个变量,使用一个变量之外,我们可以通过内存地址来访问一个变量,使用一个变量


程序元素包括变量数组元素

通过这个 & 操作符 来获取程序元素的地址,

内存地址打印出来会是什么样子?

无符号整数的样子

 

 这个打印出来的是一个16 进制数,这个16 进制数占用几个字节啊,占用4 个字节,换句话说,获取的地址是一个 4 字节的无符号整数


为什么我们说 32位系统/64位系统?

这个 32位 / 64位 指的是可访问的最大内存地址是多少

显然 64位系统比32位系统所运行的程序多的多


我们通过内存地址可以访问一个变量,但是我们也要注意,访问一个变量时,我们得指明这个变量所占用的字节数是多少

char*  pChar; //这里定义了一个指针变量,这个指针变量显然要保存一个内存地址,使用这个变量保存的内存地址,我们肯定可以使用它保存的数据,访问的数据长度,也就是范围是什么,是一个字节,我怎么知道是一个字节的呐? 因为是 char ,意味着通过这个变量所保存的地址访问内存时,只能访问一个字节


通过指针所保存的地址能够访问内存中的数据,具体怎么做呐?

通过这个 操作符就可以了,“  *   ”(指针访问操作符),这个具体访问什么?访问内存中的数据

int * p;  //定义了一个指针变量
...
printf("%d",);   //打印一个整型数,那么这个整型数怎么来呐? 通过 * 号作用于p,这个是什么意思?通过 * 号去访问内存中的数据,那么访问哪个内存地址中的数据呐?访问 p 这个指针所保存的内存地址中的数据,那访问的范围是什么?是 4 个字节

指针既然是变量,有没有类型呐?   就是数据类型加上 * 号

可以把  int *  这个整体看成一个指针类型,同样的把  char* 看成是一个整体,这个整体表示了一种指针类型

double 浮点类型 是一个普通的数据类型

double * 这个时候在double 后面加上一个* 号,这个整体变成了一种指针类型

所以我们定义指针变量的时候就会这样写,数据类型 加上 * 号   type* p ; 然后就是一个指针类型了,接下来就是指针的名字

为什么指针变量的类型统一占用 4字节或8字节?

因为指针变量是用来保存内存地址的,所以指针必须有能力保存任意一个地址值,因此必须是4字节或者8字节


NULL(专用于指针的名词) 这是一个零址,表示 0 地址  ,换句话说,在32位操作系统中这一个标识符就等价于 0x00 00 00 00 ,这个值就是 0,所以 

int * pVar = NULL; 这行代码就是想用 0 来初始化 pVar 这个指针变量

&var 取这个 var 变量的地址 ,将var这个变量的地址赋值给指针变量 pVar,这样这个指针变量就保存了var这个变量的地址,

然后通过访问操作符 * ,访问这个指针中内存地址里面的数据

#include <stdio.h>

int main()
{
    int var = 0;
    int* pVar = NULL;
    int another = 0;

    printf("1. var =  %d\n", var);
    printf("1. pVar = %p\n", pVar);  //因为指针变量里面保存的是地址,要打印地址的话,就要使用 %p

    pVar = &var;  //使用指针保存变量的地址
    
    *pVar = 100;  // *pVar 等价于 var ,var = 100   

    printf("2. var =  %d\n", var);  
    printf("2. pVar = %p\n", pVar);

    pVar = &another;  //改变了 pVar的指向,使得 pVar 保存 another 的地址     

    *pVar = 1000;    //another = 1000;  (通过pVar 这个指针改变了another这个变量的值)
                    //(通过指针来改变内存中的数据)   通过 * 号访问操作符作用于pVar,也就是要访问这个指针 pVar 所指向的地址中的数据,这个地址中的数据其实就是 another 这个变量这个变量保存的数据

    printf("3. another=  %d\n", another);  
    printf("3. pVar = %p\n", pVar);

    printf("4. add ==> %d\n", var + another + *pVar);   // 100 + 1000 + 1000 ==> 2100

    return 0;
}

 


总结 :

1.指针的本质是变量,而变量的本质是 容器,所以指针就为容器,而这种容器是用来装 内存地址的

2.在 C语言中就使用指针来保存程序元素的内存地址,比如用指针保存变量的地址

3.指针既然可以保存程序元素的内存地址,接着我们就可以使用指针访问所保存的内存地址当中的数据,具体怎么做?需要使用 * 操作符(访问操作符),通过 * 号,我们就可以访问指针所保存的内存地址中的数据

4.指针既然是变量,就有类型

 

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

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

相关文章

如何利用TURF分析来对餐厅菜品进行组合搭配?

1.数据源说明 1.1 数据简单说明 本数据源采用的是某餐厅8月份的销售明细表。本文会主要用到一下字段值&#xff1a; order_id&#xff0c; 产品订单号dishes_name&#xff0c;菜品名称counts, 消费数量amounts&#xff0c;消费金额 1.2 数据截图 以下是数据源的截图 1.3…

【移动端网页布局】移动端网页布局基础概念 ⑤ ( 视网膜屏技术 | 二倍图概念 | 代码示例 )

文章目录 一、视网膜屏技术二、二倍图概念三、代码示例 一、视网膜屏技术 PC 端 和 早期的 移动端 网页中 , CSS 中配置的 1 像素 对应的就是物理屏幕中的 1 像素 ; Retina 视网膜屏幕 技术出现后 , 将多个物理像素压缩到一块屏幕中 , 可以达到更高的分辨率 , 画面显示效果更好…

【Linux】磁盘与文件系统

目录 一、磁盘的物理结构 二、磁盘逻辑抽象 三、文件系统 1、Super Block 2、Group Descriptor Table 3、inode Table 4、Data Blocks 5、inode Bitmap 6、Block Bitmap 四、Linux下文件系统 1、inode与文件名 2、文件的增删查改 2.1、查看文件内容 2.2、删除文件…

Node工程的依赖包管理方式 | 京东云技术团队

作者&#xff1a;京东零售 陈震 在前端工程化中&#xff0c;JavaScript 依赖包管理是非常重要的一环。依赖包通常是项目所依赖的第三方库、工具和框架等资源&#xff0c;它们能够帮助我们减少重复开发、提高效率并且确保项目可以正确的运行。 目前比较常见的前端包管理器有 n…

uniapp打包app,调用相机功能时在真机调试可以,打包成app之后不行

在打包成app之后报如图所示错误&#xff1a; 解决&#xff1a; 在app模块配置勾选上相机这一项&#xff0c;如图&#xff1a; 这是主要针对上面这个报错的&#xff0c;当然还有一下情况比较类似&#xff0c;就是相机功能在真机调试下可以&#xff0c;打包之后就不行了。我总结…

第九章_Redis哨兵(sentinel)

是什么 吹哨人巡查监控后台master主机是否故障&#xff0c;如果故障了根据投票数自动将某一个从库转换为新主库&#xff0c;继续对外服务 作用 哨兵的作用&#xff1a; 1、监控redis运行状态&#xff0c;包括master和slave 2、当master down机&#xff0c;能自动将slave切换成…

面试京东失败,再看看两年前的面试题,根本不是一个难度

刚从京东走出来&#xff0c;被二面难到了&#xff0c;我记得学长两年前去面试的时候&#xff0c;问的问题都特别简单&#xff0c;咋现在难度高了这么多。面试前我也刷过很多的题和看过很多资料&#xff0c;后来想想&#xff0c;这年头网上软件测试资料泛滥&#xff0c;软件测试…

Linux使用crontab编写定时任务

Linux使用crontab编写定时任务 安装 yum install -y crontabcrontab服务启动与关闭 service crond start #启动服务 service crond stop #关闭服务 service crond restart #重启服务 service crond reload #重新载入配置 service crond status #查看状态chkconfig crond on …

【广州华锐互动】火电厂3D沉浸式事故体验,提高员工安全意识和应急处理能力

火电厂是一种重要的能源生产方式&#xff0c;但是在运营过程中也存在着一些风险和隐患。为了降低火电厂事故的发生率&#xff0c;提高员工的安全意识和应急处理能力&#xff0c;火电厂3D沉浸式事故体验系统成为了一个重要的工具&#xff0c;为企业安全管理起到了不可替代的作用…

python 第一章——简介与环境搭建

文章目录 前言一、什么是编程语言二、下载python解释器三、安装pycharm 前言 本系列教程目录可点击这里查看&#xff1a;python教程目录 python在当今世界的流行度应该已经不用我多说了&#xff0c;这可以从TIOBE的榜单中可窥一二 作为一门面向编程新人的语言&#xff0c;它…

【无标题】基于K-means聚类的多智能体跟随多领导者算法

源自&#xff1a;系统仿真学报 作者&#xff1a;袁国栋 何明 马子玉 张伟士 刘学达, 李伟 摘 要 为防止多智能体集群跟随多个领导者时编队混乱&#xff0c;提出了3种K-means聚类算法&#xff0c;将集群分成与领导者数量相同的社区&#xff0c;社区内的智能体将跟随同一领导…

解决PDF转Word问题:三种免费转换方法大比拼

在职场办公中&#xff0c;我们经常会遇到将PDF文件转换为可编辑的Word文件的问题。虽然网上有很多PDF转Word工具&#xff0c;但许多工具要么需要付费&#xff0c;要么转换后的文件无法直接编辑。所以&#xff0c;你可能会想知道是否有免费且效果好的PDF转Word工具。在本文中&am…

基于Java+SpringBoot+vue+element疫情药品采购出入库系统设计实现

基于JavaSpringBootvueelement疫情药品采购出入库系统设计实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联…

使用opencv进行场景识别

opencv场景识别 文章目录 opencv场景识别一、需求1、现状2、设想 二、模型使用1、opencv dnn支持的功能2、ANN_MLP相关知识3、图像分类模型训练学习4、目标检测模型5、opencv调用darknet物体识别模型 三、模型训练1、现状2、步骤-模型编译3、步骤-模型训练 一、需求 1、现状 …

配置Maven(精简版)

一.下载配置相关版本的maven 1..下载maven文件 maven下载官网&#xff1a;点击 点进去官网&#xff0c;点击Download 往下拉找到这个 下载就可以了&#xff0c;下载完成后找地方解压。 2.配置环境变量 变量名&#xff1a;MAVEN_HOME 变量值&#xff1a;自己的安装目录 编…

最新,有8本SCIE期刊被剔除,4月SCIESSCI期刊目录更新(附最新目录下载)

2023年4月18日&#xff0c;科睿唯安更新了WOS期刊目录&#xff0c;继上次3月WOS期刊目录更新大变动之后&#xff0c;此次4月更新又有8本SCIE期刊发生变动&#xff0c;其中有4本期刊被剔出SCIE数据库&#xff0c;4本期刊更改了名称和ISSN号。更新后的最新SCIE期刊目录共有9505本…

基于51单片机的脉搏测量仪设计与实现

目录 前言 一、设计背景 二、系统功能 三、系统硬件设计 3.1 总体方案设计 3.2 信号采集电路设计 3.3 报警电路设计 3.4 下载电路 3.5 电源电路设计 3.6 OLED显示设计 3.7 键盘电路 四、系统软件设计 4.1 系统主程序设计 4.2 脉搏采集子程序设计 4.3 键盘程序设…

浏览器自动化(一)

目录 介绍 下载地址 安装教程 爬取百度热搜 介绍 Automa 是一个免费、开源的 Chrome 扩展&#xff0c;它通过目前流行的 No Code 无代码方式&#xff0c;只需要拖拽模块就实现了浏览器自动化&#xff0c;比如自动填写表格、执行重复性任务。 在工作中&#xff0c;如果我们…

Nacos单机搭建

Nacos概述 Nacos Nacos是阿里巴巴开源的服务注册中心及配置中心&#xff0c;致力于给开发者提供一款便捷、简单上手的开源框架 Nacos注册中心Eureka 服务配置Config 服务总线Bus 服务发现和服务健康监测 Nacos 使服务更容易注册&#xff0c;并通过DNS或HTTP接口发现其他…

Java企业电子招标采购系统源码Spring Boot + Mybatis + Redis + Layui + 前后端分离 构建企业电子招采平台之立项流程图

项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&#xff0c;以及…