当前位置: 首页 > news >正文

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 内存 要学习指针,就先要了解内存。一起来看。 内存是计算机中的关键组成部分&#xff…...

PHP8中字符串与数组的转换-PHP8知识详解

在php8中使用explode()函数和implode()函数实现字符串和数组之间的转换。 1、使用explode()函数把字符串按照一定的规则拆分为数组中的元素&#xff0c;并且形成数组。 使用explode()函数把字符串转换数组&#xff0c;示范代码&#xff1a; <?php $string "html,cs…...

Wordtune:文本编辑工具

【产品介绍】 名称 Wordtune 上线时间 成立于2018年。​ 具体描述 Wordtune是一款基于人类智能的文本编辑工具&#xff0c;它可以帮助用户快速修改和重写英文&#xff0c;以改进文本的清晰度、流畅度和可读性。Wordtune使用先进的自然语言处理技术&#x…...

notifyIcon动态图标

定时器内调用下面代码 代码如下&#xff1a; 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)上市&#xff0c;规模最大、流动性最高的股票表现。提供一个覆盖墨西哥股市的广泛、具有代表性且可轻易复制的指数。根据多元化要求&#xff0c;按市值…...

JWT生成与解析/JWT令牌前端存储

第一步&#xff1a;创建项目 添加Maven依赖&#xff1a; <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.62</version> </dependency> <dependency><groupId>org.s…...

[交互]前端展示服务端获取的图片

可以通过以下步骤从服务端获取图片&#xff1a; 引入axios库&#xff1a;在前端代码中使用axios库来发送HTTP请求。可以通过以下方式引入axios&#xff1a; import axios from axios;发送请求&#xff1a;使用axios发送HTTP请求&#xff0c;获取图片文件的二进制数据。发送请求…...

LeetCode2.两数相加

一看完题&#xff0c;我的想法是先算出这两个链表表示的数&#xff0c;然后相加&#xff0c;然后把这个数一位一位的分配给第三个数组&#xff0c;这种方法应该很简单但是要遍历三次数组&#xff0c;于是我就想直接一遍遍历&#xff0c;两个链表同时往后面遍历&#xff0c;把这…...

Linux编译过程与交叉编译

一.GCC由来 GCC&#xff08;GNU编译器套件&#xff09;是一个自由开源的编程工具集&#xff0c;用于编译和链接C、C和其他编程语言的程序。它由理查德斯托曼&#xff08;Richard Stallman&#xff09;和其他自由软件基金会&#xff08;Free Software Foundation&#xff09;的…...

MediaPipe+OpenCV 实现实时手势识别(附Python源码)

MediaPipe官网&#xff1a;https://developers.google.com/mediapipe MediaPipe仓库&#xff1a;https://github.com/google/mediapipe 一、MediaPipe介绍 MediaPipe 是一个由 Google 开发的开源跨平台机器学习框架&#xff0c;用于构建视觉和感知应用程序。它提供了一系列预训…...

为什么选择C/C++内存检测工具AddressSanitizer?如何使用AddressSanitizer?

目录 1、C程序中的内存问题 2、AddressSanitizer是什么&#xff1f; 3、AddressSanitizer内存检测原理简述 3.1、内存映射 3.2、插桩 4、为什么选择AddressSanitizer&#xff1f; 4.1、Valgrind介绍 4.2、AddressSanitizer在速度和内存方面为什么明显优于Valgrind 4.3…...

获取vue当前页面url问号后面的参数

除了使用 window.location.search 或 Vue Router 的 $route.query 来获取 URL 问号后面的参数之外&#xff0c;您还可以使用 JavaScript 中的正则表达式来解析 URL 中的参数部分。以下是一个示例&#xff1a; // 获取当前页面的完整 URL const currentURL window.location.hre…...

Linux编程之线程池的设计与实现

Linux编程之线程池的设计与实现&#xff08;C98&#xff09; 代码 假设服务器的硬件资源“充裕”&#xff0c;那么提高服务器性能的一个很直接的方法就是空间换时间&#xff0c; 即“浪费”服务器的硬件资源&#xff0c;以换取其运行效率。 提升服务器性能的一个重要方法就是…...

stm32---定时器输入捕获

一、输入捕获介绍 在定时器中断实验章节中我们介绍了通用定时器具有多种功能&#xff0c;输入捕获就是其中一种。 STM32F1除了基本定时器TIM6和TIM7&#xff0c;其他定时器都具有输入捕获功能 。输入捕获可以对输入的信号的上升沿&#xff0c;下降沿或者双边沿进行捕获&#xf…...

打造生产级Llama大模型服务

对于任何想要尝试人工智能或本地LLM&#xff0c;又不想因为意外的云账单或 API 费用而感到震惊的人&#xff0c;我可以告诉你我自己的旅程是如何的&#xff0c;以及如何开始使用廉价的消费级硬件执行Llama2 推理 。 这个项目一直在以非常活跃的速度发展&#xff0c;这使得它非…...

Acwing 828. 模拟栈

Acwing 828. 模拟栈 题目要求思路讲解代码展示 题目要求 思路讲解 栈&#xff1a;先进后出 队列&#xff1a;先进先出 代码展示 #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. 为什么需要虚拟化、容器化&#xff1f;3. 虚拟化的实现方式主机虚拟化的实现方式容器虚拟化实现 4. 虚拟机和Docker的区别 Docker安装 基于Centos7进行安装 1.确认系统版本和CPU架构&#xff0c;Centos7的x86_64架构…...

HTTPS Tomcat Servlet 博客系统 软件测试的概念 Linux

第 1 题&#xff08;多选题&#xff09; 题目名称&#xff1a; 以下关于http和https说法正确的是 题目内容&#xff1a; A .http是超文本传输协议 B .https是超文本传输安全协议 C .http是明文传输 D .https是加密传输 第 2 题&#xff08;单选题&#xff09; 题目名称…...

​云南财经大学《乡村振兴战略下传统村落文化旅游设计》许少辉八一著作

​云南财经大学《乡村振兴战略下传统村落文化旅游设计》许少辉八一著作...

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 邻居平滑处理并构…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

MySQL的pymysql操作

本章是MySQL的最后一章&#xff0c;MySQL到此完结&#xff0c;下一站Hadoop&#xff01;&#xff01;&#xff01; 这章很简单&#xff0c;完整代码在最后&#xff0c;详细讲解之前python课程里面也有&#xff0c;感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...