(C语言)指针初识(1)——指针概念及指针类型

2023-11-08

        指针,看似是一个令人头疼的问题,静下心来慢慢学习。指针这个主题,分成了几个的板块,比较多,耐心看完,一定会有收获啦!慢慢来,总是需要一个循序渐进的过程。

目录

一、什么是指针

二、指针和指针类型

指针类型的意义:

结论1:

结论2:


一、什么是指针

        把指针想象成是一个房间号,简单的想一下,在一个风和日丽的早晨,你去了一家偌大的宾馆,你第一次去,找不到对应的房间,而那些房间从外面看起来,真的就是一摸一样。而这个时候,你该怎么办呢?宾馆的房间号在这时候是不是就起作用了。

        而内存呢,也是类似于这样的,将内存空间切割为一个个小的内存单元,并对其进行编号。其编号就是地址,也称为指针。

1、指针就是地址,是内存中一个最小单元的编号

2、口语中的指针其实指的是指针变量,是用来存放内存地址的变量

3、指针变量里面存放的是地址,而通过这个地址,就可以找到一个内存单元

4、指针的大小:在32位平台是4个字节,64位平台是8个字节(x86-->32位环境,x64-->64位环境)

理解过程:内存空间是如何管理的?

(1)、切割成内存单元,每个内存单元为1个byte(字节)

(2)、给每个内存单元进行编号(编号的意义:能够快速找到指定的内存单元),把内存单元的编号称为地址

(3)、指针就是地址,地址就是编号,即:指针就是内存单元的编号

分析如下代码:

#include<stdio.h>
int main()
{
	int a = 0;
	int* p = &a;
	return 0;
}

上述代码的理解:

(1)、a是整型变量,占用4个字节的内存空间,如图:

注:(A、内存单元的编号,是当程序执行时,直接有硬件生成的,所以每一次运行,其编号都是不一样的。

       (B、&a——就是通过取地址操作操作符,取出a的地址,所以,&a就是代表a的编号,即:&a就是a的地址

(2)、int* p=a;

p是一个指针变量,用来存放地址的(用来存放指针的),而通过这个地址,就可以找到相应的一个内存单元。

注:再次强调,口语中会说,p就是一个指针,实际上指的是p是一个指针变量,而指针变量就是一个变量,用来存放地址的一个变量。

分析如下代码:

int main()
{
	int* p = NULL;
	char* l = NULL;
	double* d = NULL;
	//printf("%d\n", sizeof(p));
	//printf("%d\n", sizeof(int*));
	//printf("%d\n", sizeof(char*));
	//printf("%d\n", sizeof(double*));

	printf("%zu\n", sizeof(p));
	printf("%zu\n", sizeof(int*));
	printf("%zuh\n", sizeof(char*));
	printf("%zu\n", sizeof(double*));
	return 0;
}

        我这里用的在x64的环境下,所以输出都是8。在这里有一个小小的细节,我们没有使用%d的形式打印,而是zu,原因:sizeof返回值的类型为无符号整型-->unsigned int---->所以上面用%d打印会有警告。在这里也再次验证了,指针的大小只与平台有关。

二、指针和指针类型

指针类型的意义:

结合下面代码分析:

代码1:

#include<stdio.h>
int main()
{
	int a = 0x11223344;
	int* pa = &a;
	*pa = 0;//改变了4个字节
	printf("%d\n", *pa);
	
	
	return 0;
}

分析:

1、0x开头的是十六进制数,两个十六进制数代表一个字节,因为一个十六进制位能翻译为4个二进制位,2个就是8个二进制位,8个二进制数就是一个字节,因此2个十六进制数对应1个字节。

2、存放0x11223344需要4个字节,而int a刚好就是4个字节的空间。在调试中,去内存里面查看&a,就可以观察到,已经存放进去了,至于为什么是倒着存进去的,这里先不深究。

 3、当调试走到*pa=0;时观察内存&a的值就变成了如下:

 是将4个字节都改变成了00

代码2:

#include<stdio.h>
int main()
{
    int a=0x11223344;
    char* pc1 = &a;//int* 和char* 类型不兼容
	char* pc = (char*)&a;//所以在这里要进行强制类型转换
	*pa = 0;//只改变了一个字节,因为是char* 类型的
	printf("%d\n", *pc);
    return 0;
}

分析:

1、在调试中,去内存里面查看&a,就可以观察到,已经存放进去了。(每次程序运行时,分配的地址都是随机的,所以这里的&a的地址编码和代码1中的编码不同)

 2、char*是可以存放int*的地址,差异在于取出使用时会有差异

3、当调试走到*pa=0后,在走一步,会发现如下结果:

在这里只改变了第一个字节的值

结论1:

结合代码1、2,我们发现,指针变量类型的不同不会影响指针所占空间的大小。

指针类型决定了指针在被解引用的时候访问几个字节。

如果是int*的指针,解引用访问4个字节

如果是char*的指针,解引用访问1个字节

推广:

如果是double*的指针,解引用访问8个字节

代码2:

#include<stdio.h>
int main()
{
	int a = 0x11223344;
	int* pa = &a;
	char* pc = (char*)&a;

	printf("pa  =%p\n", pa);
	printf("pc  =%p\n", pc);

	printf("\npa  =%p\n", pa);
	printf("pa+1=%p\n", pa + 1);

	printf("\npc  =%p\n", pc);
	printf("pc+1=%p\n", pc + 1);

	return 0;
}

运行结果:

 分析:

1、char*是可以存放int*的地址的

2、计算pa+1是加了4个字节,而计算pc+1时,加了1个字节

结论2:

指针的类型决定了指针+-1操作时,跳过几个字节

决定了指针的步长

误区:

虽然float*和int*的权限看似一样,但并不意味着 float*和 int*能通用

因为不同的类型,看待数据的视角不同。int* 看待的是整型的数据,而float*看待的是浮点型的数据。例:

代码:

int main()
{
	int a = 0;

	int* pi = &a;//pi解引用访问4个字节,pi+1也是跳过4个字节
	float* pf = &a;//pf解引用访问4个字节,pf+1也是跳过4个字节

	*pi = 100;

	return 0;
}

打开调试,查看内存中&a,如下:

 100的十六进制就是64

代码:

int main()
{
	int a = 0;

	int* pi = &a;//pi解引用访问4个字节,pi+1也是跳过4个字节
	float* pf = &a;//pf解引用访问4个字节,pf+1也是跳过4个字节

	//*pi = 100;
	*pf = 100;

	return 0;
}

打开调试,查看内存中&a,如下:

int*以整型数据存储方式去存储的 , float* 是以浮点数据存储方式去存储的 ,二者在存储时其规则是不同的,所以存储时的值会有差异,所以,二者是不能混用的。

指针这个主题会持续更新的喔,慢慢看。

如有不对的地方,还望大佬指出!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(C语言)指针初识(1)——指针概念及指针类型 的相关文章

随机推荐

  • Macbook pro搭建unbutu18.04的步骤(省钱又实惠)

    第一步 下载parallels desktop 链接 https pan baidu com s 17Bqw0rWezrfOMLZqTaImag 密码 h0z5 注意 在线下载 离线安装 省钱省事 永久自动激活 小编花了十块钱 第二步 运行
  • AppsFlyer 研究(二)应用内事件

    一 记录应用内事件 应用内事件可助您深入了解应用里正在发生的事 我们建议您花些时间定义要记录的事件 记录应用内事件有助于您衡量KPI 例如ROI 投资回报率 和LTV 生命周期价值 有几种方法可以记录应用内事件 最常见的方法是通过我们在本文
  • Activiti7工作流+idea2021监听器法器的使用

    法器 这次需要个好宝贝 4 监听器 工作流的开头都是创建bpmn文件 注意一点细节问题 需要加监听器了 首先我们得有一个监听器 package listener import org activiti engine delegate pub
  • 2023年电赛---运动目标控制与自动追踪系统(E题)关于网友的问题回复

    如果有嵌入式企业需要招聘校园大使 湖南区域的日常实习 任何区域的暑假Linux驱动实习岗位 可C站直接私聊 或者邮件 zhangyixu02 gmail com 此消息至2025年1月1日前均有效 前言 1 各位私信问问题之前 看看自己的问
  • prometheus监控docker容器实战

    1 cAdvisor介绍 要监控docker状态 需要使用一个软件cAdvisor cAdvisor Container Advisor 是Google开源的容器资源监控和性能分析工具 它是专门为容器而生 可以用于收集正在运行的容器资源使用
  • 企业级日常巡检脚本的编写

    1 系统信息 1 1 操作系统类型 查看操作系统类型命令为 uname 例 root host 134 uname Linux 定义变量 os type uname 1 2 操作系统版本号 查看操作系统版本号命令为 cat etc redh
  • 【论文阅读】Learning Spatio-Temporal Representation with Pseudo-3D Residual Networks

    论文阅读 Learning Spatio Temporal Representation with Pseudo 3D Residual Networks 虽然这是一篇17年ICCV的论文 但是这篇论文里没有使用kinetics数据集 可能
  • 在UFT中使用描述性编程

    在 UFT 中使用描述性编程是一个提高UFT脚本利用率的很好的方式 通常UFT是通过对象库来识别不同的对象 而描述性编程是UFT另外一种能够识别对象的途径 它不依赖于对象库 通过增加一些对象的描述来识别对象的 说明 本例子是以Flight飞
  • 一个问答机器人模型该如何构建

    构建一个问答机器人模型 通常需要以下步骤 准备数据 需要大量的问题和答案对 以供模型学习 预处理数据 可能需要对数据进行分词 词性标注 去停用词等操作 以便输入模型进行训练 选择模型类型 常用的问答机器人模型类型有基于知识库的模型 基于生成
  • 网工学习笔记

    1 什么是IP地址 IP地址 Internet Protocol Address 互联网国际地址 是一种在Internet上的给主机编址的方式 它主要是为互联网上的每一个网络和每一台主机分配一个逻辑地址 以此来屏蔽物理地址的差异 IP地址就
  • APP脱壳之MDEX的使用步骤

    并不是每一个APP都会加壳 根据以往的经验 一般情况下加壳的有两种情况 第一种是像360公司 腾讯 百度这些公司 他们有自己的加壳技术 就会给自己需要加壳的产品都会加壳 第二种是普通APP 包括但不限于一些色情类的 或者其他用户体量不大的A
  • Cuda 学习教程六:执行模型

    Cuda 学习教程六 执行模型 今天看到一篇讲解CUDA模型的文章 很不错 转载记录一下 CUDA编程4 执行模型 上
  • 雨滴桌面插件大全_电脑技巧之桌面美化,字体美化,透明效果全都有

    Windows技巧 桌面美化篇 电脑的日常使用中 相信百分之九十九的玩家的电脑显示得最多的不是游戏也不是办公软件 而是桌面 一个干净整洁甚至是漂亮的桌面能够大幅度提高电脑日常使用的幸福感 今天我就来分享一下电脑的桌面美化软件 1 字体美化
  • 解决缺少api-ms-win-crt-runtime-

    答主在安装MongoDB的时候 遇到了api ms win crt runtime 1 1 0 dll的问题 历经两天时间终于解决 下面是我的解决历程 首先是这个图 这个是因为没有微软的visual2015c 运行库环境 需要安装 地址 h
  • 刷脸识别改变支付零售日常生活

    据对相貌特征信息的生物辨认技能促就了刷脸付的诞生 并且付宝官方力推刷脸付旨在替代了扫码付出 当然新型的刷脸付款方式关于很多人仍是比较忧虑的 觉得会存在必定安全隐患 那么刷脸付安全吗 有保证吗 那么下面就来解答大家所忧虑的刷脸付安全性问题 早
  • webpack打包入口指定某文件夹内所有js作为入口文件

    webpack config js webpack config js const path require path const glob require glob module exports 指定 packs 文件夹下的 js 文件作
  • Navicat连接MySQL时弹出:1045:Access denied for user ‘root’@’localhost’

    错误原因 当登录MySQL数据库出现 Error 1045 错误时 表明你输入的用户名或密码错误被拒绝访问了 也可能是你的账号不允许从远程登录 只能在localhost本地登录数据库 解决办法如下 用管理员权限打开cmd 并且cd进入mys
  • 点云读取加速c++ ASCii 模式ply 或者txt

    相较于Qt Qtextstream的性能提升十倍 本文点云格式特殊 有需要自行修改即可 QFile dataFile fileName bool ret dataFile open QIODevice ReadOnly QIODevice
  • 浅谈JS的微任务和宏任务(附加面试题)

    Event Loop 因为JS是单线程 就是说 同一个时间只能做一件事 为了协调事件 用户交互 脚本 UI 渲染和网络处理等行为 防止主线程的不阻塞 Event Loop 的方案应用而生 掌握知识点 JS分为同步任务和异步任务 同步任务都在
  • (C语言)指针初识(1)——指针概念及指针类型

    指针 看似是一个令人头疼的问题 静下心来慢慢学习 指针这个主题 分成了几个的板块 比较多 耐心看完 一定会有收获啦 慢慢来 总是需要一个循序渐进的过程 目录 一 什么是指针 二 指针和指针类型 指针类型的意义 结论1 结论2 一 什么是指针