C语言 —— 初步入门知识(内存、指针、结构体)
本篇文章将接着上篇继续介绍C语言的基础知识,那么对于C语言大部分初学者会觉得难以理解, 所以作者将指针单独拿出来写篇较短的文章进行讲解。
1.指针
1.1 内存
要学习指针,就先要了解内存。一起来看。
内存是计算机中的关键组成部分,用于存储数据和程序。每个内存单元的大小通常是1字节,这意味着它可以存储8位的二进制数据(每个位可以是0或1)。
当计算机需要访问内存中的特定位置时,它需要生成一个地址,以便指示内存控制器要读取或写入哪个内存单元的数据。对于32位的计算机,生成地址的过程涉及到32根地址线。
这些地址线的状态(通电或不通电)以二进制形式表示。例如,如果计算机有32根地址线,它们可以同时处于以下状态:
- 00000000 00000000 00000000 00000000(对应0)
- 00000000 00000000 00000000 00000001(对应1)
- ...
- 11111111 11111111 11111111 11111111(对应最大的32位二进制值)
这些地址线的不同组合产生不同的二进制地址。每个不同的地址都对应一个内存单元(1字节),因此,对于32位电脑来说,它可以管理的最大内存容量为4GB(千兆字节)。
所以,如果一个内存单元的大小是1字节,并且计算机使用32位地址线,那么它可以管理的最大内存容量就是4GB。这意味着它可以同时访问和处理4GB的数据和程序。这种地址线和内存容量的关系对计算机的性能和功能有重要影响,因此在计算机硬件设计中非常重要。
如何理解内存? 这个时候就要类比生活中的例子.
在生活中有许多的居民楼, 居民楼里面整个空间就被划分为一个个房间, 对每个房间进行编号, 这样就能很好的知道每个房间的位置. 假如要送外卖到某个房间, 那么只要知道客户的地址, 也就是房间的编号就可以准确无误的送达.
那么内存也是一样的, 内存就相当于上面例子中的"居民楼", 划分出的单元"房间"的编号就是内存单元的地址. 当给内存空间的每个单元编号, 有地址了之后, 需要找到哪个内存空间就会非常的方便.
总结如下:
内存划分成一个个小的内存单元,每个内存单元的大小是1个字节.
为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址.

上图中的编号为十六进制
1.2 变量在内存中的存储
变量是创建内存中的(在内存中分配空间的),每个内存单元都有地址,所以变量也是有地址的。
编写以下代码进行调试, 来查看变量在内存中的存储.
int main()
{int a = 10; // 向内存申请 4 个字节的空间, 存储 10&a; // 取地址操作符return 0;
} 

如果需要看内存也可以在调试->窗口->内存打开内存调试窗口进行查看.(注意这里面的窗口必须是先开始调试才能看到监视/内存窗口)


输入&a, 按下回车可以看到,

内存窗口中的地址和上方监视窗口显示的&a的值是相同的.
十进制: 0 1 2 3 4 5 6 7 8 9
八进制: 0~7
十六进制: 0~9 a b c d e f
十进制的10 转化为二进制:
0000 0000 0000 0000 0000 0000 0000 1010
再转化为十六进制:
0 0 0 0 0 0 0 a
即:
0x 00 00 00 0a
到内存中则倒序存储(暂时不解释为什么倒序)
所以可以看到, 内存中确实存储了数据10.
通过%p可以打印a的地址.

1.3 指针变量存储地址
1.3.1 指针与指针变量
我们在前面打印的a的地址, 是个十六进制的数字, 下面我们假设a的地址为0x0012ff40(凭空捏造出来的地址, 用以说明), 那么这个地址也是可以像int a = 10;把10存进a中一样, 将这个地址存进某个变量中, 如下所示.
int* p = &a; 把a的地址取到, 放到p中, 那么p的变量类型为int*. 此时, 这个变量p就叫做指针变量.
我们前面有聊到内存单元, 每个内存单元都有编号, 那么这个编号其实就是地址, 而这个"地址"也别称为"指针". 所以指针就是地址.
上面的p是用来存a的地址的, 也就是存a的编号, 也就是存a的指针. 所以把存放地址, 存放指针的变量叫做指针变量.
当p是指针变量的时候如何理解它?

1.3.2 存储地址的意义
我们通过地址可以找到地址上的对象, 现在p中存放了a的地址, 那么就可以通过p找到a.
*p; *是解引用操作符, 这里意思是通过p中存放的地址, 找到p所指向的对象,*p就是p指向的对象, 也就是a.
int main()
{int a = 10;printf("%p\n", &a);int* p = &a; printf("%d\n", a);*p = 20;printf("%d\n", a);return 0;
} 
1.3.3 指针变量的大小
不管是什么类型的指针, 都是在创建指针变量. 指针变量是用来存放地址的, 它的大小取决于一个地址存放需要的大小.
32位平台下地址是32个bit位 (即4个字节)
64位平台下地址是64个bit位 (即8个字节)
int main()
{printf("%zu\n", sizeof(char*)); // 4printf("%zu\n", sizeof(short*)); // 4printf("%zu\n", sizeof(int*)); // 4printf("%zu\n", sizeof(float*)); // 4printf("%zu\n", sizeof(double*)); // 4return 0;
} 2.结构体
之前我们已经有学过各种数据类型, 比如char, short, int, long, float, double等等, 但是这些类型不能表示所有的情况, 因为这些类型表示一些数值是没有任何问题的, 但是如果需要表示一个复杂对象, 比如要表示 人.就得要有名字, 年龄, 性别, 地址, 电话. 再比如表示一本 书. 就得要有书名, 作者, 出版社, 定价, 书号. 所以要表示一个复杂对象就不能用简单的数据类型表示, 这个时候C语言就给了程序员自定义类型的能力, 自定义类型中有一种是结构体.
结构体是把一些单一类型组合在一起的做法.
// 学生
struct Stu
{// 成员char name[20];int age;char sex[10];char tele[12];
};void print(struct Stu* ps)
{printf("%s %d %s %s\n", (*ps).name, (*ps).age, (*ps).sex, (*ps).tele);// -> // 结构体指针变量->成员名printf("%s %d %s %s\n", ps->name, ps->age, ps->sex, ps->tele);}
int main()
{// 结构体初始化struct Stu s = {"zhangsan", 20, "nan", "01234567890"};// 结构体对象.成员名printf("%s %d %s %s\n", s.name, s.age, s.sex, s.tele);print(&s);return 0;
} 
相关文章:
C语言 —— 初步入门知识(内存、指针、结构体)
本篇文章将接着上篇继续介绍C语言的基础知识,那么对于C语言大部分初学者会觉得难以理解, 所以作者将指针单独拿出来写篇较短的文章进行讲解。 1.指针 1.1 内存 要学习指针,就先要了解内存。一起来看。 内存是计算机中的关键组成部分ÿ…...
PHP8中字符串与数组的转换-PHP8知识详解
在php8中使用explode()函数和implode()函数实现字符串和数组之间的转换。 1、使用explode()函数把字符串按照一定的规则拆分为数组中的元素,并且形成数组。 使用explode()函数把字符串转换数组,示范代码: <?php $string "html,cs…...
Wordtune:文本编辑工具
【产品介绍】 名称 Wordtune 上线时间 成立于2018年。 具体描述 Wordtune是一款基于人类智能的文本编辑工具,它可以帮助用户快速修改和重写英文,以改进文本的清晰度、流畅度和可读性。Wordtune使用先进的自然语言处理技术&#x…...
notifyIcon动态图标
定时器内调用下面代码 代码如下: if(DateTime.Now.Second % 2 0) {notifyIcon1.Icon new System.Drawing.Icon(Application.StartupPath "\abc.ico");}else{notifyIcon1.Icon new System.Drawing.Icon(Application.StartupPath "\abc2.ico"…...
2023年墨西哥 SP/BMV IPC 研究报告
第一章 指数概况 1.1 指数基本情况 墨西哥 S&P/BMV IPC 指数衡量在墨西哥证券交易所 (Bolsa Mexicana de Valores, BMV)上市,规模最大、流动性最高的股票表现。提供一个覆盖墨西哥股市的广泛、具有代表性且可轻易复制的指数。根据多元化要求,按市值…...
JWT生成与解析/JWT令牌前端存储
第一步:创建项目 添加Maven依赖: <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.62</version> </dependency> <dependency><groupId>org.s…...
[交互]前端展示服务端获取的图片
可以通过以下步骤从服务端获取图片: 引入axios库:在前端代码中使用axios库来发送HTTP请求。可以通过以下方式引入axios: import axios from axios;发送请求:使用axios发送HTTP请求,获取图片文件的二进制数据。发送请求…...
LeetCode2.两数相加
一看完题,我的想法是先算出这两个链表表示的数,然后相加,然后把这个数一位一位的分配给第三个数组,这种方法应该很简单但是要遍历三次数组,于是我就想直接一遍遍历,两个链表同时往后面遍历,把这…...
Linux编译过程与交叉编译
一.GCC由来 GCC(GNU编译器套件)是一个自由开源的编程工具集,用于编译和链接C、C和其他编程语言的程序。它由理查德斯托曼(Richard Stallman)和其他自由软件基金会(Free Software Foundation)的…...
MediaPipe+OpenCV 实现实时手势识别(附Python源码)
MediaPipe官网:https://developers.google.com/mediapipe MediaPipe仓库:https://github.com/google/mediapipe 一、MediaPipe介绍 MediaPipe 是一个由 Google 开发的开源跨平台机器学习框架,用于构建视觉和感知应用程序。它提供了一系列预训…...
为什么选择C/C++内存检测工具AddressSanitizer?如何使用AddressSanitizer?
目录 1、C程序中的内存问题 2、AddressSanitizer是什么? 3、AddressSanitizer内存检测原理简述 3.1、内存映射 3.2、插桩 4、为什么选择AddressSanitizer? 4.1、Valgrind介绍 4.2、AddressSanitizer在速度和内存方面为什么明显优于Valgrind 4.3…...
获取vue当前页面url问号后面的参数
除了使用 window.location.search 或 Vue Router 的 $route.query 来获取 URL 问号后面的参数之外,您还可以使用 JavaScript 中的正则表达式来解析 URL 中的参数部分。以下是一个示例: // 获取当前页面的完整 URL const currentURL window.location.hre…...
Linux编程之线程池的设计与实现
Linux编程之线程池的设计与实现(C98) 代码 假设服务器的硬件资源“充裕”,那么提高服务器性能的一个很直接的方法就是空间换时间, 即“浪费”服务器的硬件资源,以换取其运行效率。 提升服务器性能的一个重要方法就是…...
stm32---定时器输入捕获
一、输入捕获介绍 在定时器中断实验章节中我们介绍了通用定时器具有多种功能,输入捕获就是其中一种。 STM32F1除了基本定时器TIM6和TIM7,其他定时器都具有输入捕获功能 。输入捕获可以对输入的信号的上升沿,下降沿或者双边沿进行捕获…...
打造生产级Llama大模型服务
对于任何想要尝试人工智能或本地LLM,又不想因为意外的云账单或 API 费用而感到震惊的人,我可以告诉你我自己的旅程是如何的,以及如何开始使用廉价的消费级硬件执行Llama2 推理 。 这个项目一直在以非常活跃的速度发展,这使得它非…...
Acwing 828. 模拟栈
Acwing 828. 模拟栈 题目要求思路讲解代码展示 题目要求 思路讲解 栈:先进后出 队列:先进先出 代码展示 #include <iostream>using namespace std;const int N 100010;int m; int stk[N], tt;int main() {cin >> m;while (m -- ){string o…...
初识Docker
文章目录 Docker安装Docker简介1.什么是虚拟化、容器化?2. 为什么需要虚拟化、容器化?3. 虚拟化的实现方式主机虚拟化的实现方式容器虚拟化实现 4. 虚拟机和Docker的区别 Docker安装 基于Centos7进行安装 1.确认系统版本和CPU架构,Centos7的x86_64架构…...
HTTPS Tomcat Servlet 博客系统 软件测试的概念 Linux
第 1 题(多选题) 题目名称: 以下关于http和https说法正确的是 题目内容: A .http是超文本传输协议 B .https是超文本传输安全协议 C .http是明文传输 D .https是加密传输 第 2 题(单选题) 题目名称…...
云南财经大学《乡村振兴战略下传统村落文化旅游设计》许少辉八一著作
云南财经大学《乡村振兴战略下传统村落文化旅游设计》许少辉八一著作...
shopee——排序模型AUC还能涨吗?
文章目录 CBMRMultiCBMRSample Weight Assignment多任务推荐模型 CBMR MultiCBMR Sample Weight Assignment Click-aware Structure Transfer with Sample Weight Assignment for Post-Click Conversion Rate Estimation 每个用户的top-k 邻居每个商品的top-k 邻居平滑处理并构…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...
给网站添加live2d看板娘
给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...
Ubuntu系统复制(U盘-电脑硬盘)
所需环境 电脑自带硬盘:1块 (1T) U盘1:Ubuntu系统引导盘(用于“U盘2”复制到“电脑自带硬盘”) U盘2:Ubuntu系统盘(1T,用于被复制) !!!建议“电脑…...
