指针初阶(指针类型转换的使用、指针数组)

news2024/9/21 19:47:16

一.指针基础

0.指针的大小

        指针指向的是一块地址,所以指针存储的是地址,例如在32位系统中。定义了一个int32_t类型的变量。使用int32_t *定义一个指针,使其指向该变量。

        设该变量存储在地址为00000000000000000000000000000001(32位地址)中,指针指向该变量,其实就是指针P存储了该变量的首地址

        既然指针P里面存储的是首地址(存储空间第一个字节的地址),在32位地址系统中,那么显然指针P里面要存32位二进制数,所以指针P的大小就是4个字节。同理在64位系统中,指针的大小为8个字节。

1.指针的步长

①.char、uint8_t 类型指针

若定义一个char或uint8_t类型的数组,用char*/uint8_t*定义的指针指向该数组


#include <stdio.h>
#include <stdint.h>

int main()
{
	uint8_t buf[8] = {1,2,3,4,5,6,7,8};
	uint8_t *p = buf;
	
	printf("p    :%p\n",p);        //打印P初始指向的地址
	printf("p+1:%p\n",p+1);        //P+1后的地址
	printf("p+2:%p\n",p+2);        //P+2后的地址
   
   return 0;
}

        根据打印出的值来看,uint8_t类型的指针每次加1,则其内部存储的地址值也加1

即跳过了一个字节)

     

②.int16_t类型的指针

        若定义一个uint16_t类型的数组,用uint16_t*定义的指针指向该数组

#include <stdio.h>
#include <stdint.h>

int main()
{
	uint16_t buf[8] = {1,2,3,4,5,6,7,8};
	uint16_t *p = buf;
	
	printf("p    :%p\n",p);
	printf("p+1:%p\n",p+1);
	printf("p+2:%p\n",p+2);
   
   return 0;
}

        

        根据打印出的值来看,uint16_t类型的指针每次加1,则其内部存储的地址值加2

即跳过了两个字节)

③.int32_t类型的指针

#include <stdio.h>
#include <stdint.h>

int main()
{
	uint32_t buf[8] = {1,2,3,4,5,6,7,8};
	uint32_t *p = buf;
	
	printf("p    :%p\n",p);
	printf("p+1:%p\n",p+1);
	printf("p+2:%p\n",p+2);
   
   return 0;
}

        根据打印出的值来看,uint32_t类型的指针每次加1,则其内部存储的地址值加4

即跳过了四个字节)

总结

        规律其实已经出来了,当执行指针P+1时,P内存储的地址不一定也只加1。地址具体的变化要看该指针是什么类型的,uint8_t(一个字节)则P+1时,其内部地址会跳过一个字节;uint16_t(两个字节)则P+1时,其内部地址会跳过两个字节。以此类推......

二.指针类型转换

        前面已经提到,指针内部存储的是地址。

        指针的类型有uint8_t,uint16_t,uint32_t,float等等,现在来定义一个uint8_t类型的数组,再定义uint8_t,uint16_t,uint32_t类型的指针。

#include <stdio.h>
#include <stdint.h>

int main()
{
	uint8_t buf[8] = {0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01};
	uint8_t *u8_p = buf;
	uint16_t *u16_p = buf;
	uint32_t *u32_p = buf;
	
	printf("u8_p[0]    :%d\n",u8_p[0]);
	printf("u16_p[0]   :%d\n",u16_p[0]);
	printf("u32_p[0]   :%d\n",u32_p[0]);
   
   return 0;
}

        指针的类型其实起到了一个“翻译”的作用,不同的指针类型指向同一块地址。“翻译”出来的结果是不一样的。

1.翻译的步骤

        “翻译”的步骤大概是这样:

        假设有一块地址内的数据如下:

        用不同的指针去指向该地址的首地址       

        ①.uint8_t 

        

                已知 uint8_t 类型的指针,其步长为 1 个字节,所以 u8_p 每次  + 1 ,都是跳过 1 个字节。u8_p[0] 也就是该地址首地址的内容,当作 uint8_t 类型的数据来看,就是 1 。

        ②.uint16_t 

                 已知 uint16_t 类型的指针,其步长为 2 个字节,所以 u16_p 每次  + 1 ,都是跳过 2 个字节。u16_p[0] 也就是该地址中前 2 个字节的内容,一起当作 uint16_t 类型的数据来看,就是 257 。

        ③.uint32_t

        

                 已知 uint32_t 类型的指针,其步长为 4 个字节,所以 u32_p 每次  + 1 ,都是跳过 4 个字节。u32_p[0] 也就是该地址中前 4 个字节的内容,一起当作 uint32_t 类型的数据来看,就是 16843009 。

2.总结

        (1)

        其他 float 等类型的指针也是一样,要是这段地址,你想以float类型去翻译它,只需定义一个   float * float_p 类型的指针指向首地址,然后 float_p[0] 就是我们需要的数据。
   

     (2)

        如果给你了一个 uint8_t 类型的数组如下:

uint8_t buf[8] = {0xc3,0xf5,0x48,0x40,0x9a,0x99,0xb1,0x40};

        要把这个数组里面的数据变成 float 类型的数据,并存储起来,则需要这么做

float value1,value2;

value1 = ((float *)buf)[0];        //指针类型转换
value2 = ((float *)buf)[1];

        以上,就是将 uint8_t 类型的数组里面的值,转换成 float 类型的数据

三.指针数组

1.定义

    指针数组,其强调的是数组,这个数组里面存的是指针。

    假设在存储空间中,有一条字符串 "hello" ,它是这么存储的:

    要找到这条字符串,就得知道它的地址,也就是首字节(首个字符)的地址。

                而字符串指针数组,里面存的其实就是对应字符串的首地址

                            buf[0] = 0X00000000;
                            buf[1] = 0X00000006;

              

        

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

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

相关文章

远程调用-OpenFeign(一)

目录 1.RestTemplate存在问题 2.OpenFeign介绍 一、主要特点 二、应用场景 3.OpenFeign快速上手 3.1引入依赖 3.2添加注解 3.3编写OpenFeign的客户端 3.4远程调用 ​编辑3.5测试 4.OpenFeign参数传递 4.1传递单个参数 4.2传递多个参数 4.3传递对象 4.4传递JSO…

编程修炼之Hibernate--- springboot启动初始化ddl过程

文章目录 跟踪Springboot整合hibernate的启动代码&#xff1a; 开始初始化 entityManagerFactory 创建方言 dialect 继续排查

Koa商城项目-轮播图模块(后端)

前言 通过这次独自做前后端发现有很多需要提升的地方&#xff0c;很多细节处理不到位。下面简单看一下本人自己做的效果吧~~ Git地址 https://gitee.com/ah-ah-bao/koa_system 效果图 后端逻辑分析 首先编写route->banner.router.js /*** author: zxb* date: 2024-08-06…

Socket编程TCP 基础

一.什么是Socket(套接字&#xff09; 定义&#xff1a;就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端&#xff0c;提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲&#xff0c;套接字上联应用进程&#x…

【文献阅读】A Comprehensive Review of Multimodal Large Language Models

一、回顾 MLLMs 在语言、图像、视频和音频处理等多模态任务中表现出色。这些模型通过整合多模态信息来增强多模态任务的有效性。 在自然语言处理&#xff08;NLP&#xff09;任务中&#xff0c;如文本生成和机器翻译&#xff0c;MLLMs 利用图像、视频和音频提供上下文支持&am…

C#开发实验--卫星星历的计算、空间直角坐标和大地坐标的转换、ArcGIS Engine开发的简单实例

前不久在公众号GIS研发看到了暑假公益C#开发教程&#xff0c;教大家ArcGIS Engine开发。 想到了自己本科阶段也学习了C#开发和AE开发&#xff0c;学习了使用C#添加空间等&#xff0c;进行卫星星历的计算、空间直角坐标和大地坐标的转换、ArcGIS Engine开发的简单实例。 下面的…

数据结构与算法--插入排序与选择排序

文章目录 回顾提要排序基本概念排序的分类排序算法的稳定性排序算法的性能指标内排序 排序方法直接插入排序直接插入排序的要点直接插入排序的实现直接插入排序性能分析直接插入排序的适用情景 简单选择排序简单选择排序的要点简单选择排序的执行过程简单选择排序的实现简单选择…

虚幻5|布料模拟

打开骨骼网格体 1.Mass Prooerties 如果给角色施加风力&#xff0c;密度越大越难飘&#xff0c;相反密度越小飘动浮度也小 2.Material Proerties Edge Stiffness,对衣服的折痕处的调整&#xff0c;其值越大就越能维持原本的折痕&#xff0c;相反折痕就会变小&#xff0c;但…

【Mudo】实战项目之应用层模块

文章目录 前言正文1. Util1.1 File1.2 Url1.3 Str1.4 Infor 2. Http2.1 Request2.2 Response2.3 Context2.4 Server 尾序 前言 在上一篇文章当中&#xff0c;博主从代码的层面介绍了服务器模块的实现&#xff0c;最终封装出了一个传输层的TcpServer模块&#xff0c;那么在本篇…

中国篆刻艺术孙溟㠭凿木《未来之门》

孙溟㠭凿木《未来之门》 每人都有着自己对未来的期盼&#xff0c;未来并不遥远&#xff0c;下一秒就是未来&#xff0c;当下的一切好和一切的恶是暂时的&#xff0c;都会随着时间一秒一秒过去&#xff0c;走向未来&#xff0c;希望每人都能尽早打开未来之门&#xff0c;到达自己…

Arduino开源四足蜘蛛机器人制作教程

视频教程&#xff1a;手把手叫你做四足蜘蛛机器人——1零件介绍_哔哩哔哩_bilibili 一、项目介绍 1.1 项目介绍 Arduino主控&#xff0c;图形化编程&#xff0c;趣味学习 Arduino nano开发板舵机扩展底板 4.8V可充电电池&#xff0c;支持Arduino C语言编程和米思齐图形化编程…

Linux os下借助Qt+libvlc是实现多路拉取摄像头rtsp数据流并实时显示

前言 应客户方的一个实际项目需求&#xff0c;需要在Linux操作系统下拉取多路摄像头的RTSP数据流并实时显示。 该项目的硬件平台基于飞腾2000四核处理器与景嘉微显卡&#xff0c;搭载了Kylin V10操作系统。 当前景嘉微GPU最多支持同时连接16路摄像头&#xff0c;拉取1920x108…

C++中二叉搜索树的底层原理及实现

小编在学习完二叉搜索树(SearchBinaryTree)之后觉得虽然二叉搜索树不是很难&#xff0c;但是它对于后面学习C中的AVL树和红黑树及map和set的封装都有重要的作用&#xff0c;因此小编今天带给大家二叉搜索树的原理及实现&#xff0c;话不多说&#xff0c;开始学习&#xff01;~~…

<Linux> git

在使用git之前&#xff0c;要先在linux中安装git yum list | grep git yum install -y 文件名 在第一次安装git时&#xff0c;需要进行下面的操作 git config --global user.email "你的邮箱名" git config --global user.name "你想要的名字" 1. git clon…

LeetCode 热题 HOT 100 (038/100)【宇宙最简单版】

【动态规划】No. 0337 打家劫舍III【中等】&#x1f449;力扣对应题目指路 希望对你有帮助呀&#xff01;&#xff01;&#x1f49c;&#x1f49c; 如有更好理解的思路&#xff0c;欢迎大家留言补充 ~ 一起加油叭 &#x1f4a6; 欢迎关注、订阅专栏 【力扣详解】谢谢你的支持&a…

NGINX 常用内置变量

目录 $remote_addr 变量 $args 变量 $is_args 变量 $document_root 变量 $document_uri 变量 $host 变量 $limit_rate 变量 $remote_port 变量 $remote_port --显示客户端端口 $request_method 变量 --返回请求方式 $request_filename 变量 --返回请求实际路径 $request_uri…

eNSP 华为ACL配置

华为ACL配置 需求&#xff1a;公司保证财务部数据安全&#xff0c;禁止研发部门和互联网访问财务服务器&#xff0c;但总裁办不受影响 R1&#xff1a; <Huawei>sys [Huawei]sys Router1 [Router1]undo info-center enable [Router1]int g1/0/0 [Router1-GigabitEthern…

AI 工程应用 建筑表面检测及修复

文章目录 1 项目概述&#xff08;必写&#xff09;&#xff1a;2 技术方案与实施步骤2.1 模型选择&#xff08;必写&#xff09;&#xff1a;2.2 数据的构建&#xff1a;2.3 功能整合&#xff08;进阶&#xff09;&#xff1a; 3 实施步骤&#xff1a;3.1 环境搭建&#xff08;…

【Nginx】nginx的核心配置

1.nginx的文件启动 [rootNginx ~]# vim /lib/systemd/system/nginx.service [Unit] DescriptionThe NGINX HTTP and reverse proxy server Aftersyslog.target network-online.target remote-fs.target nss-lookup.target Wantsnetwork-online.target [Service] Typeforking P…

Python -- GUI图形界面编程—GUI编程实例 博主也在持续学习中[ 持续更新中!!! 欢迎白嫖 也求粉啊啊啊~ ]

本文介绍了GUI的图形界面编程&#xff08;相关视频是哔站上的应该搜这个题目就能找到&#xff09;&#xff0c;文章还是很基础的&#xff0c;反正我是小白从0开始&#xff0c;主要的结构tinkter库、重要组件简介&#xff08;这个不用死记硬背 用的时候再说&#xff09;、Label&…