C语言指针初步(1)

本期重点:指针的性质、本质和作用


指针是C语言变量的一种,总的来说,它和int或者char之类的变量类型没有什么显著的区别,唯一的重点在于,指针实际上是地址。可以说指针就是地址,它是一个专门用于存放地址的变量,下面我们简单的看一下这个东西怎么回事:

首先要明确的是,指针类型定义的时候,根据指针本身的性质和类型的不同可以划分到不同的领域,有的是整形指针比如int* a,有的是字符类型指针比如char* b,判断一个变量是否是指针变量,区别就在于它的类型后面有没有一个星号(*),如果有,那大概率应该就是个指针。类型和星号之间可以加任意的空格,不过最好不要加,因为可能会造成概念的混淆,一定要牢记一点,那就是指针a的类型是int*,这是一个整体,而不是说,int类型的*a是一个指针。至于这个符号的构成,有意思的一点在于,指针本身只能存放地址,因此它其实无所谓是什么类型,然而解引用的时候,对地址内内容的操作取决于它类型的效果,比如对char* a解引用,和对int* b解引用后,*a和*b操作的时候操作起来是不一样的,*a+1和*b+1的结果不同就能证明这一点。下面我们看一下:

#include<stdio.h>
int main()
{int num[3] = { 5 };int* pnum = &num;char* pNum = &num;*(pnum + 1) = 5;*(pNum + 1) = 5;printf("%p", pnum);printf("%p", pnum+1);return 0;
}

9755bad7ee444fab82b35d5bd7327738.png

运行该代码调试之后,我们发现,num[0]的地址和指针pnum的内容是完全一致的,而取地址&num和它们也是完全一样的,由此可以知道,指针里存入的其实是对象的地址,尤其是对象的首位地址。比如num[0]这个东西,本身有四个字节,也就是说,它有四个地址,从上面运行的结果来看,就是从0x00000096da3ff588到0x00000096da3ff58b,但是真正传入pnum的其实只是num[0]的第一个字节的地址,也就是首位地址。

那么,为什么我说其实指针的类型对指针解引用后的操作才有影响呢?从上面内容来看,确实指针变量本身只能用于存储地址,看样子类型是什么问题不大,下面我们看一下指针类型对于它解引用后的操作的影响:

#include<stdio.h>
int main()
{int num[3] = { 5 };int* pnum = &num;char* pNum = &num;*(pnum + 1) = 5;//*(pNum + 1) = 5;printf("%p", pnum);printf("%p", pnum+1);return 0;
}

现在我们沉默一条语句之后进行调试看看对地址内内存内容的影响:

db27830632784ef6a96ed0a01ab2f05c.png

如果你把507行语句也沉默的话,你就会发现,只有那个928地址里面只有第一位是05,其他的都是00,而507行语句对05 00 00 00之后的一位也进行了修改,改成了05。为什么会跳过三位呢?因为pnum指针是int类型的,int类型占四个字节,因此这个指针+1的时候,就会在内存里跳过一个整形,也就是四个字节。下面我们解除对508行的沉默:

6d804ba49b65413b9ac2091b7b813e48.png

有了第508行的影响,我们发现,C38地址里面第一个由于初始化而变成05的字节后面马上又多了一个05,这就是508行导致的,因为pNum指针的类型是char*,char类型的长度是1字节,因此pNum+1会跳过一个char长度,也就是超过一个字节。

由此我们可以看出,指针的类型对于它存储地址是没有影响的(这一点可以通过对int*、char*、float*等等进行sizeof操作看出,长度是一样的),只在它解引用并进行进一步操作的时候影响比较大。

还有一件事,如果你玩原神的话,你有没有感觉空(Aether)和荧(Lumine)的关系不纯洁?在睡前故事结尾的剧情里,他俩似乎有骨科,我不确定,但是我觉得很香,这很好。

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

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

相关文章

基于STM32的智能语音识别饮水机系统设计

功能描述 1、给饮水机设定称呼&#xff0c;喊出称呼&#xff0c;饮水机回答&#xff1a;我在 2、语音进行加热功能&#xff0c;说&#xff1a;请加热&#xff0c;加热片运行 3、饮水机水位检测&#xff0c;低于阈值播报“水量少&#xff0c;请换水” 4、检测饮水机水温&#xf…

Java项目:校园宿舍管理系统(优质版)(Springboot3+Maven+Mybatis Plus+Vue3+ Element Plus+Mysql)

项目介绍 : Springboot3MavenMybatis PlusVue3 Element PlusMysql 开发的前后端分离的校园宿舍管理系统 项目演示: https://www.bilibili.com/video/BV16UmoYWEVR/ 运行环境: 最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 IDE环境&#x…

【开源项目】数字孪生仓储~经典开源项目数字孪生智慧仓储——开源工程及源码

飞渡科技数字孪生仓储管理平台&#xff0c;基于国产数字孪生引擎平台&#xff0c;整合WMS系统&#xff0c;深度融合5G、大数据、云计算、AI、融合通信等前沿技术应用&#xff0c;将数据、技术、设备与仓储管理需求有机结合&#xff0c;构建多维立体可视窗口&#xff0c;实现仓库…

unity3d————Resources异步加载

知识点一&#xff1a;Resources异步加载是什么&#xff1f; 在Unity中&#xff0c;资源加载可以分为同步加载和异步加载两种方式。同步加载会在主线程中直接进行&#xff0c;如果加载的资源过大&#xff0c;可能会导致程序卡顿&#xff0c;因为从硬盘读取数据到内存并进行处理…

计算机毕业设计Python+CNN卷积神经网络股票预测系统 股票推荐系统 股票可视化 股票数据分析 量化交易系统 股票爬虫 股票K线图 大数据毕业设计 AI

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

这个 AI 懂 Vue 吗?

作者&#xff1a;前端俱乐部 写在前面 最近海外的 AI 编辑器 Cursor 好像挺火的&#xff0c;与此同时&#xff0c;字节跳动也推出了豆包MarsCode编程助手&#xff0c;可以直接生成代码和极限编程。 豆包MarsCode AI 支持网页版编辑器&#xff0c;但我个人更喜欢让它和人气爆棚…

海量数据面试题

目录 前言 什么是海量数据 一、利用位图解决 二、利用布隆过滤器解决 三、利用哈希切割解决 前言 在大数据时代&#xff0c;海量数据处理已成为技术领域中的一项重要课题。无论是企业级应用、互联网平台&#xff0c;还是人工智能和机器学习的实现&#xff0c;都离不开对大规…

复现论文-报错记录dream-ood

复现论文Dream the Impossible: Outlier Imagination with Diffusion Models 过程中出现的问题记录 服务器&#xff1a;NIVIDA2080ti github: 论文&#xff1a; arxiv.org/pdf/2309.13415 1.pytorch使用出现"RuntimeError: An attempt has been made to start a new proc…

LinkedList与链表

目录 一、链表 链表相关练习题 二、LikedList 1、构造方法 2、常用方法 3、LinkedList的遍历 4、ArrayList与LinkedList的区别 一、链表 链表是一种物理存储结构上非连续存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的引用链接次序实现的 链式结构在逻辑上是连…

vulnhub靶机hackxor提示(部分写出)

靶机地址&#xff1a;Hackxor: 1 ~ VulnHub 主机发现 130是靶机 端口扫描 服务扫描 漏洞扫描 Hosts配置&#xff08;这个是需要在网上找的&#xff0c;这个是靶机的缘故搭建不完全所以需要自己写hosts&#xff09; 访问wraithmail:8080 数据包 GET http://utrack/cat.jsp?id1…

录的视频怎么消除杂音?从录制到后期的杂音消除攻略

在录制视频时&#xff0c;杂音往往是一个令人头疼的问题。无论是环境噪音、设备噪音还是电磁干扰&#xff0c;杂音的存在都会极大地影响视频的听觉体验。录的视频怎么消除杂音&#xff1f;通过一些前期准备和后期处理技巧&#xff0c;我们可以有效地消除这些杂音&#xff0c;提…

C++内存模型与并发支持

本文是CppCon23演讲&#xff1a;C Memory Model&#xff1a;from C11 to C 23的笔记&#xff0c;掺杂个人见解以及扩展 内存模型 操作系统的四个特性&#xff1a;虚拟&#xff0c;并发&#xff0c;持久 抽象中很重要的一部分就是内存虚拟。从编程的角度来看&#xff0c;编程就…

机器学习day5-随机森林和线性代数1

十 集成学习方法之随机森林 集成学习的基本思想就是将多个分类器组合&#xff0c;从而实现一个预测效果更好的集成分类器。大致可以分为&#xff1a;Bagging&#xff0c;Boosting 和 Stacking 三大类型。 &#xff08;1&#xff09;每次有放回地从训练集中取出 n 个训练样本&…

jdk1.7的hashmap为什么会出现死循环问题

原因在于链表结构出现了环状。为什么会出现环状的链表&#xff1f; 原因在于多个线程同时进行扩容的时候。 由于一个线程使用的是头插法进行迁移数据到新开辟的数组中&#xff0c;使得链表中的数据是颠倒的顺序。 而当另一个线程扩容的时候就可能因为这个颠倒的顺序而出现指针…

微信小程序navigateTo:fail webview count limit exceed

theme: nico 你们好&#xff0c;我是金金金。 场景 uniapp编写微信小程序&#xff0c;使用uni.navigateTo跳转的过程中报错如下&#xff1a; 报错意思也非常明显了&#xff1a;errMsg":"navigateTo:fail webview 数量超出限制 排查 排查之前我先贴一下代码 代码非…

逆向攻防世界CTF系列33-流浪者

逆向攻防世界CTF系列33-流浪者 shiftf12看到pass&#xff0c;跟进 是个输入的处理&#xff0c;其实很简单&#xff0c;看不懂也没关系&#xff0c;先看看return 这里strcmp成功后return的就是成功 最后要为KanXueCTF2019JustForhappy while ( *(_DWORD *)(a1 4 * v4) < 0x…

算法--解决二叉树遍历问题

第一 实现树的结构 class Node(): # 构造函数&#xff0c;初始化节点对象&#xff0c;包含数据和左右子节点 def __init__(self, dataNone): self.data data # 节点存储的数据 self.left None # 左子节点&#xff0c;默认为None self.rig…

Ubuntu22.04.2 k8s部署

k8s介绍 简单介绍 通俗易懂的解释&#xff1a; Kubernetes&#xff08;也被称为 K8s&#xff09;就像是一个大管家&#xff0c;帮你管理你的云计算服务。想象一下&#xff0c;你有很多个小程序&#xff08;我们称之为“容器”&#xff09;&#xff0c;每个都在做不同的事情&…

游戏引擎学习第12天

视频参考:https://www.bilibili.com/video/BV1yom9YnEWY 这节没讲什么东西&#xff0c;主要是改了一下音频的代码 后面有介绍一些alloc 和malloc,VirtualAlloc 的东西 _alloca 函数&#xff08;或 alloca&#xff09;分配的是栈内存&#xff0c;它的特点是&#xff1a; 生命周…

Linux-软件管理-本地仓库和网络资源仓库配置(RHCSA)

该章节的目录如下&#xff1a; 认识rpm包 将设备挂载到/mnt上面 查看光驱上的相关信息 使用rpm包管理软件 仓库的配置(重要) 无相关文件 本地仓库配置&#xff08;书写相关的仓库文件&#xff09; 配置流程 效果测试&#xff08;安装卸载&#xff09; 查看仓库 清理…