C 认识指针

news/2024/5/19 5:07:36

目录

一、取地址操作符(&)

二、解引用操作符(*)

三、指针变量

1、 指针变量的大小

2、 指针变量类型的意义

2.1 指针的解引用

2.2 指针 +- 整数

2.3 调试解决疑惑


认识指针,指针比较害羞内敛,我们需要通过他的好朋友们认识他

一、取地址操作符(&)

//VS2022 x86
#include <stdio.h>
int main()
{int i = 1314;int* p = &i; //  &  取地址操作符;将 i 里的地址取出来放到 p 里//int* 表示p是整型指针变量,指针是用来存放地址的printf("%p\n", p);    printf("%p\n", &i);return 0;
}

把平台换成 x86 好观察(x64也可以,只是长一些,为了这篇文章后面统一都是x86平台)

运行后可以看到之这一长串数字加字母,不用管他,知道这是地址就行,可以看出:

指针p 里存放的地址和从 变量i 中取出来的地址是一样的;每次编译地址都会变,但 p == &i 。


二、解引用操作符(*)

#include <stdio.h>
int main()
{int i = 1314;int* p = &i;printf("%d\n", i);*p = 20;    // * 解引用操作符printf("%d\n", i);return 0;
}

可以看到 变量i 的值被改变了,这是因为 *p 的意思是将 p 里存放的地址通过解引用从而找到 变量i,然后赋值20;

可以这么理解,i 是一个宝藏,p 就是这个宝藏所在坐标,然后你通过正确的解读宝藏在地图上的位置(*)最终找到了宝藏,随后把它挖走并往里面放了个石头埋起来戏耍后面的人,i 就变成了石头。


三、指针变量

前面通过对他朋友的认识,顺便知道了指针变量是用来存放地址的,那这里我们需要了解他的特点

1、 指针变量的大小

#include <stdio.h>
int main()
{printf("%zd\n", sizeof(char *));printf("%zd\n", sizeof(short *));printf("%zd\n", sizeof(int *));printf("%zd\n", sizeof(double *));return 0;
x86环境下(32位平台)
x64环境下(64位平台)

结论: 

  • 32位平台下地址是32个bit位,指针变量大小是4个字节;
  • 64位平台下地址是64个bit位,指针变量大小是8个字节;
  • 注意指针变量的大小和类型是无关的,只要指针类型的变量,在相同的平台下,大小都是相同的。

不管给他任何修饰词(int*、char*),在我们面前(32位平台)就是腼腆得很,在朋友面前(64位平台)就是开放得很,所以和他交上朋友才能更了解他嘿嘿。

那就疑惑了,变量规定类型是因为有字节大小区分,指针变量大小在不同类型下字节大小都一样,那为什么要规定指针变量的类型呢?

2、 指针变量类型的意义

2.1 指针的解引用

通过代码就能很清楚的看出来啦,好好看好好学

#include <stdio.h>
int main()
{int n = 0x11223344;	//十六进制,两个数字代表一个字节char* p = (char*) &n;    //不强转会报警告*p = 0;printf("%x", n);    //%x 打印十六进制整数return 0;
}
#include <stdio.h>
int main()
{int n = 0x11223344;	//十六进制,一个数字代表一个字节int* p = &n;*p = 0;printf("%x", n);return 0;
}
char* p
int* p

可以看到,int* p 会将n的4个字节全部改为0,但是 char* p 只是将n的第⼀个字节改为0。

结论:指针的类型决定了,对指针解引用的时候有多大的权限(一次能操作几个字节)。

2.2 指针 +- 整数
#include <stdio.h>
int main()
{int n = 10;printf("%p\n", &n);printf("=================\n");char* pc = (char*)&n;printf("%p\n", pc);printf("%p\n", pc + 1);printf("=================\n");int* pi = &n;printf("%p\n", pi);printf("%p\n", pi + 1);return 0;
}

我们可以看出, char* 类型的指针变量 +1 跳过 1个字节, int* 类型的指针变量 +1 跳过了 4个字节。 这就是指针变量的类型差异带来的变化。指针 +1 ,其实跳过1个指针指向的元素。指针可以+1,那也可以-1。

结论:指针的类型决定了指针向前或者向后走一步有多大(距离)。

2.3 调试解决疑惑

诶不对哇,3.2中 cha* p 怎么改第一个字节把0x11223344的44改了,不应该是改11吗,来,跟我调试起来

(1)

(2)Ctrl+Fn+F10(或者Ctrl+F10)进入调试

(3)

(4)

(5)注意左边的箭头,Fn+F10 箭头会指向下一条语句,下到图片位置

看到了吧,内存中的0x11223344是倒着存进内存里的,所以第一个字节是44,继续按Fn+F10就可以看到 44 变为 00。



http://www.mrgr.cn/p/84586440

相关文章

Unity 性能优化之静态批处理(三)

提示&#xff1a;仅供参考&#xff0c;有误之处&#xff0c;麻烦大佬指出&#xff0c;不胜感激&#xff01; 文章目录 前言一、静态批处理是什么&#xff1f;二、使用步骤1.勾选Static Batching2.测试静态合批效果 三、静态合批得限制1、游戏对象处于激活状态。2、游戏对象有一…

(二十一)springboot实战——Spring AI劲爆来袭

前言 本节内容是关于Spring生态新发布的Spring AI的介绍&#xff0c;Spring AI 是一个面向人工智能工程的应用框架。其目标是将 Spring 生态系统的设计原则&#xff0c;如可移植性和模块化设计&#xff0c;应用到人工智能领域&#xff0c;并推广使用普通的Java对象&#xff08…

[转帖]流量一样但为什么CPU使用率差别很大

https://plantegg.github.io/2024/04/26/%E6%B5%81%E9%87%8F%E4%B8%80%E6%A0%B7%E4%BD%86%E4%B8%BA%E4%BB%80%E4%B9%88CPU%E4%BD%BF%E7%94%A8%E7%8E%87%E5%B7%AE%E5%88%AB%E5%BE%88%E5%A4%A7/ 这是我翻到2013年的一篇文章,当时惊动所有公司高人,最后分析得知原因后所有人都跪…

【c++算法篇】双指针(上)

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;算法笔记仓 朋友们大家好啊&#xff0c;本篇文章我们来到算法的双指针部分 目录 1.移动零2.复写零3.快乐数4.盛水最多的容器 1.移动零 题目链接&#xff1a;283.移动零 题目描述&#xff1a; 算法…

用python画一个正八边形

1 问题 使用turtle库的turtle.fd()函数和turtle.seth()函数绘制一个边长100的正八边形。 2 方法 1、利用for循环解决如何画出图形中相同的八条边的问题。 2、再利用turtle.fd()函数和turtle.seth()函数画出完整的图形。 代码清单 1 import turtleturtle.pensize(2)d0for i in r…

读天才与算法:人脑与AI的数学思维笔记19_深度数学

深度数学1. 深度数学 1.1. 组合与选择,是发明新事物的两个不可或缺的条件 1.1.1. 保尔瓦雷里(Paul Valry) 1.2. 利用以往的数学定理证明过程训练算法,以发现新的定理 1.3. 谷歌设在伦敦的总部整体有一种现代牛津大学的感觉,提供了有助于员工们集中注意力、进行深度思考的最…

[转帖]十年后数据库还是不敢拥抱NUMA-续篇

https://plantegg.github.io/2024/05/03/%E5%8D%81%E5%B9%B4%E5%90%8E%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%98%E6%98%AF%E4%B8%8D%E6%95%A2%E6%8B%A5%E6%8A%B1NUMA-%E7%BB%AD%E7%AF%87/ 十年后数据库还是不敢拥抱NUMA-续篇 背景 十年后数据库还是不敢拥抱NUMA, 这篇经典的纠正大…

闲来装个虚拟机Ubuntu24.04和硬盘分区及挂载

简述 最近ubuntu出新版本了&#xff0c;ubuntu24.04&#xff0c; 俗称高贵食蚁兽。5年前进行Android或者linux开发基本是在windows下的虚拟机中进行。目前&#xff0c;虽然物质基础提高了&#xff0c;功能有独立进行编译、代码管理的服务器了。可以通过ssh登录&#xff0c;但是…

[转帖]长连接黑洞重现和分析

https://plantegg.github.io/2024/05/05/%E9%95%BF%E8%BF%9E%E6%8E%A5%E9%BB%91%E6%B4%9E%E9%87%8D%E7%8E%B0%E5%92%8C%E5%88%86%E6%9E%90/ 长连接黑洞重现和分析 这是一个存在多年,遍及各个不同的业务又反反复复地在集团内部出现的一个问题,本文先通过重现展示这个问题,然后…

Git系列:config 配置

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

Rust 实战thiserror+自定义错误消息体

导航 一、背景二、实践1、导入thiserror2、自定义错误消息体&#xff08;1&#xff09;创建ErrMsg.rs和创建自定义结构体&#xff08;2&#xff09;lib.rs添加ErrMsg&#xff08;3&#xff09;main函数&#xff08;4&#xff09;完整代码 一、背景 开发中遇到需要通用、能够满…

Latex 编辑论文的一些坑

如何插入图片首先,要使用pdf作为图片的保存格式,这样图片可以以原始分辨率插入。但要实现高清图片,需要几个条件,请一定按照我说的步骤来1. 在ppt里编辑你想要的图片样子、排布、文字(真正标准的做法是在latex中用input写入文字)等2.将有效图片区域移动到ppt整个画布的左…

基于Springboot的旅游管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的旅游管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

【华为】路由综合实验(OSPF+BGP基础)

【华为】路由综合实验 实验需求拓扑配置AR1AR2AR3AR4AR5PC1PC2 查看通信OSPF邻居OSPF路由表 BGPBGP邻居BGP 路由表 配置文档 实验需求 ① 自行规划IP地址 ② 在区域1里面 启用OSPF ③ 在区域1和区域2 启用BGP&#xff0c;使AR4和AR3成为eBGP&#xff0c;AR4和AR5成为iBGP对等体…

ARM64_Ubuntu_Chrome_Python 镜像搭建最终版

ARM64_Ubuntu_Chrome_Python 镜像搭建最终版dockerfile FROM ubuntu:24.04 RUN apt-get update && apt-get install gnupg -y && apt-get clean RUN sh <<EOF cat > /etc/apt/sources.list <<EOS deb http://ftp.de.debian.org/debian sid mai…

[转帖]Linux内核版本升级,性能到底提升多少?

https://plantegg.github.io/2019/12/24/Linux%E5%86%85%E6%A0%B8%E7%89%88%E6%9C%AC%E5%8D%87%E7%BA%A7%EF%BC%8C%E6%80%A7%E8%83%BD%E5%88%B0%E5%BA%95%E6%8F%90%E5%8D%87%E5%A4%9A%E5%B0%91%EF%BC%9F%E6%8B%BF%E6%95%B0%E6%8D%AE%E8%AF%B4%E8%AF%9D/ 背景 X 产品在公有云售…

初识webpack项目

新建一个空的工程 -> % mkdir webpack-project 为了方便追踪执行每一个命令&#xff0c;最终产生了哪些变更&#xff0c;将这个空工程初始化成git项目 -> % cd webpack-project/-> % git init Initialized empty Git repository in /Users/lixiang/frontworkspace/…

WPF应用程序XAML

当WPF应用程序创建好后&#xff0c;系统会自动添加一个Grid控件到窗体上&#xff0c;通过Grid控件能够方便地对界面进行布局.下面代码中为Grid控件添加了两行两列&#xff0c;分别用RowDefinitions属性ColumnDefinitions属性表示行的集合和列的集合&#xff0c;集合中有RowDefi…

Blazor/Hybird 触屏下单程序调优笔记

环境 Blazor Net8.0 + FreeSql + Bootstrap Blazor 组件 以下都是自己瞎琢磨的和官网资料搬运,肯定有不少错漏和不合理的地方,非常希望各位大佬评论区给我建议和意见. 1. 组件化需要提升渲染性能的组件,例如触摸屏显示每个商品下单数量的商品列表 避免不必要地呈现组件子树, 执…

基于Springboot的房屋租赁管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的房屋租赁管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…