C语言 —— 初步入门知识(内存、指针、结构体)

这篇具有很好参考价值的文章主要介绍了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个字节.

为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址.

C语言 —— 初步入门知识(内存、指针、结构体),C语言,c语言,c++,青少年编程

上图中的编号为十六进制

1.2 变量在内存中的存储

变量是创建内存中的(在内存中分配空间的),每个内存单元都有地址,所以变量也是有地址的。

编写以下代码进行调试, 来查看变量在内存中的存储.

int main()
{
    int a = 10;    // 向内存申请 4 个字节的空间, 存储 10
    &a;    // 取地址操作符

    return 0;
}

C语言 —— 初步入门知识(内存、指针、结构体),C语言,c语言,c++,青少年编程

C语言 —— 初步入门知识(内存、指针、结构体),C语言,c语言,c++,青少年编程

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

C语言 —— 初步入门知识(内存、指针、结构体),C语言,c语言,c++,青少年编程

C语言 —— 初步入门知识(内存、指针、结构体),C语言,c语言,c++,青少年编程

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

C语言 —— 初步入门知识(内存、指针、结构体),C语言,c语言,c++,青少年编程

内存窗口中的地址和上方监视窗口显示的&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的地址.

C语言 —— 初步入门知识(内存、指针、结构体),C语言,c语言,c++,青少年编程


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是指针变量的时候如何理解它?

C语言 —— 初步入门知识(内存、指针、结构体),C语言,c语言,c++,青少年编程


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;
}

C语言 —— 初步入门知识(内存、指针、结构体),C语言,c语言,c++,青少年编程

1.3.3 指针变量的大小

不管是什么类型的指针, 都是在创建指针变量. 指针变量是用来存放地址的, 它的大小取决于一个地址存放需要的大小.

32位平台下地址是32个bit位 (即4个字节)

64位平台下地址是64个bit位 (即8个字节)

int main()
{
    printf("%zu\n", sizeof(char*));    // 4
    printf("%zu\n", sizeof(short*));   // 4
    printf("%zu\n", sizeof(int*));     // 4
    printf("%zu\n", sizeof(float*));   // 4
    printf("%zu\n", sizeof(double*));  // 4
    return 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语言,c++,青少年编程文章来源地址https://www.toymoban.com/news/detail-733298.html

到了这里,关于C语言 —— 初步入门知识(内存、指针、结构体)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构】带头双向循环链表(小白入门必备知识)

    前言: 💥🎈个人主页:​​​​​​Dream_Chaser~ 🎈💥 ✨✨专栏:http://t.csdn.cn/oXkBa ⛳⛳本篇内容:c语言数据结构--带头双向循环链表 目录 一.带头双向循环链表  A.带头双向循环链表概念 B.带头双向循环链表的实现 1.带头双向循环链表的结构 2.动态申请节点函数 3.链表的初始化

    2024年02月12日
    浏览(36)
  • 【数据结构】C--单链表(小白入门基础知识)

    前段时间写了一篇关于顺序表的博客,http://t.csdn.cn/0gCRp 顺序表在某些时候存在着一些不可避免的缺点: 问题: 1. 中间 / 头部的插入删除,时间复杂度为 O(N) 2. 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。 3. 增容一般是呈 2 倍的增长,势必会有一定的空间

    2024年02月16日
    浏览(51)
  • 单片机----汇编语言入门知识点

    目录 汇编语句的格式 汇编语句的两个基本语句 子程序的调用 查表程序设计 1.x和y均为单字节数的查表程序设计 2.x为单字节数y为双字节数的查表程序设计 3.x和y均为双字节数的查表程序设计 分支转移程序设计 1.单分支选择结构 2.多分支选择结构 循环程序设计 (1) 计数循环控

    2024年04月28日
    浏览(48)
  • 从C语言到C++:C++入门知识(2)

    朋友们、伙计们,我们又见面了,本期来给大家解读一下有关C++的基础知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏: C语言:从入门到精通 数据结构专栏: 数据结构 个  人  主  页 : stackY、 目录 前言: 1. 函数重载

    2024年02月08日
    浏览(44)
  • 从C语言到C++:C++入门知识(1)

    朋友们、伙计们,我们又见面了,本期来给大家解读一下有关C++语言的相关知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏: C语言:从入门到精通 数据结构专栏: 数据结构 个  人  主  页 : stackY、   目录 前言: 1. 什么

    2024年02月07日
    浏览(58)
  • C++入门知识点——解决C语言不足

    😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️Take your time ! 😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️ 💥个人主页:🔥🔥🔥大魔王🔥🔥🔥 💥所属专栏:🔥魔王的修炼之路–C++🔥 如果你觉得这篇文章对你有帮助,请在文章结尾处留下你的 点赞 👍和 关注 💖,支持一下博主

    2024年02月12日
    浏览(48)
  • 【准研一学习】狂肝15小时整理的Verilog语言入门知识

    Verilog和VHDL就是目前使用最多的两个硬件描述语言(HDL),如果阅读本文的你也是Verilog新手,这部分闲言或许对你有所启发。 作者本科是计算机科学与技术专业,现在是准研一,方向和硬件相关。 由于学艺不精,只会点C、Java,电路、信号、单片机等硬件课程都只懂皮毛。由于

    2024年02月05日
    浏览(57)
  • STM32 基础知识入门 (C语言基础巩固)

    1、在不改变其他位的值的状况下,对某几个位进行设值 这个场景在单片机开发中经常使用,方法就是先对需要设置的位用操作符进行清零操作, 然后用|操作符设值。 比如我要改变 GPIOA 的 CRL 寄存器 bit6(第 6 位)的值为 1,可以先对寄 存器的值进行清零操作:  然后再与需

    2024年02月01日
    浏览(56)
  • 『C语言从入门到进阶』第 ⓪ 期 - 初识C语言 | C语言知识预览

    🌸作者简介: 花想云 ,在读本科生一枚,C/C++领域新星创作者,新星计划导师,阿里云专家博主,CSDN内容合伙人…致力于 C/C++、Linux 学习。 🌸 专栏简介:本文收录于 C语言从入门到精通专栏 。 本篇文章主要内容为 了解C语言阶段我们将要学习的内容 。在本文中,我们 不

    2023年04月09日
    浏览(43)
  • 自然语言处理从入门到应用——LangChain:基础知识与介绍

    分类目录:《大模型从入门到应用》总目录 LangChain系列文章: 基础知识 快速入门 安装与环境配置 链(Chains)、代理(Agent:)和记忆(Memory) 快速开发聊天模型 模型(Models) 基础知识 大型语言模型(LLMs) 基础知识 LLM的异步API、自定义LLM包装器、虚假LLM和人类输入LLM(

    2024年02月13日
    浏览(90)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包