学长教你学C-day5-C语言变量与数据类型

news/2024/4/26 14:05:27/文章来源:https://blog.csdn.net/qq_51701007/article/details/127611524

  小韩是一个学习比较刻苦认真的学生,虽然老师上课进度刚讲到输入输出,但是小韩已经自学到C语言指针部分的内容了。但是进度太快的弊端就是有些东西很难消化吸收,这不就遇到了问题,来请教小刘:“学长,你说这个指针到底是地址还是变量啊,我怎么越看头越晕呢?”小刘笑道:“指针的全名叫指针变量,从表面来看他其实就是个变量,但是从深层来看因为它存储的数据有些特殊,是内存中的地址,所以我们有时才会说‘指针就是地址’,逻辑上讲指针变量存储的是地址变量,那不谈变量指针不就是地址了吗?”小韩恍然大悟:“原来是这个意思啊!”。
  小刘又说:“其实很多人学C学到最后搞不懂指针是什么,地址是什么,其实是对内存的理解不到位。当你明白了数据是怎么在内存中存放的,CPU又是通过什么在内存中获取数据的时候(其实就是通过数据的地址),你就大概明白为什么编程入门要学C,学C是能学到很多计算机底层的东西的。”
  小刘感慨道:“现在市面上很多教C语言的教程都把指针和内存放到最后面讲,无疑给人带来一种很难、不好学的心里压力,我认为没有必要,C语言很多地方都涉及到内存、地址的知识,我觉得在有一些基础后循序渐进的引出内存和地址才是正确的做法,而不是把它积压到最后,一股脑的灌输给学生。你想,本来前面学的还蛮轻松愉快的,到最后“当头一棒”这谁能不懵?”
  “所以你们不用担心,我会以最简单的通俗易懂的方式循序渐进的给你们讲C语言,不用担心哪里会学不懂,其实只要找对了方法学什么都是轻松愉快的。接下来我会先给你们讲讲C语言的变量和数据类型然后在由此引申出一些内存的知识。”
  小刘又来到了熟悉的教室,说:“同学们,C语言基本的输入输出我们已经学过了,今天来学习新的内容——变量和数据类型。其实,变量和数据类型我们早就接触过了,只不过没有给大家做正式的介绍。我们来这段代码:[code_1]”

#include<stdio.h>
int main()
{int a,b,c;a = 1;b = 1;c = a+b;printf("%d",c);return 0;
}

输出
在这里插入图片描述

  “这段代码非常简单,有哪位同学能口头描述一下这个代码的过程?”
  小韩跃跃欲试:“我来!”
  “好,那你就来给大家分析分析。”
  “首先我们定义了三个整数,然后给a,b赋值为1,c赋值为a+b,最后输出c的结果为2。”
  “非常好,就是这个意思。那么其实你们已经知道了,我们定义的a,b,c都是整数,而在C语言中整数就是一种数据类型。数据类型其实就是一组具有相同属性的数据的集合。比如说1,2,3……这些都是属于整数类型的,在C语言中定义整数类型的值用 int 表示。那么加上小数点1.0,2.0……9.8,10.999后这些表示的就都是小数,在C语言中我们更习惯称为浮点数。而浮点数又分为单精度浮点数和双精度浮点数。二者的区别从名字就可以看出来,后者比前者的精确度更高,表示的范围更大,所以占的内存空间也就更大。单精度浮点型定义用 float ,双精度浮点型定义用 double 。示例代码:[code_2]”

#include<stdio.h>
int main()
{float a;double b;a = 1.123;b = 1.123;printf("%f\n",a);printf("%lf\n",b);return 0;
}

输出
在这里插入图片描述

  “从这个输出结果我们能看出,浮点型的数通常会默认保留小数点的后六位。且输出时float的格式符是%f,double的格式符为%lf。意义就是 %lf 比 %f 表示的范围要更大。”
  “除了整数和浮点数外,还有一个最常见的数据类型就是char。这个数据类型在我们前面将字符和字符串的输入输出的时候也是经常用到。如果想表示单个字符就定义一个字符变量,如果想表示一个字符串就定义一个字符数组。这个就不做过多介绍了。[code_3]”

#include<stdio.h>
int main()
{char a = 'a';char array[20] = "Hello World!";printf("%c\n",a);printf("%s\n",array);return 0;
}

输出
在这里插入图片描述

我们常用到的除了int、char、float、double以外,还有void(空类型)也是我们常用的,但是我们通常不会用它来定义变量,而是定义一个没有返回值的函数的时候才会用到。

在这里插入图片描述

  “这些就是我们常用的五个基本数据类型。下面说说bool(布尔)类型和wchar_t(宽字符)类型。”
  “bool类型非常简单,因为这个类型的变量只有两个值,一个是true(真),一个是false(假)。通常,我们会在做一些逻辑判断的时候用到。[code_4]”

#include<stdio.h>
int main()
{bool a;if(a){printf("ture\n");}else{printf("false\n");}return 0;
}

输出
在这里插入图片描述

  “默认情况下,布尔变量值为false,也可以赋值为true。[code_5]”

#include<stdio.h>
int main()
{bool a;a=true;if(a){printf("ture\n");}else{printf("false\n");}return 0;
}

输出
在这里插入图片描述

  “在C语言中也可以用0,1表示false和true。例如:[code_6]”

#include<stdio.h>
int main()
{bool a;a = 1;if(a){printf("ture\n");}else{printf("false\n");}return 0;
}

输出
在这里插入图片描述

  “宽字符类型顾名思义就是比char类型的字符所占的内存空间更大,我们用代码更好解释一下它和char的区别。[code_7]”

#include<stdio.h>int main()
{char c='c';wchar_t wc='w';printf("char c = %c,byte:%d\n",c,sizeof(c));printf("char wc = %c,byte:%d\n",wc,sizeof(wc));char cc[20]="Hello World!";wchar_t wcc[20]=L"Hello World!";printf("cc=%s\n",cc);printf("wcc=%ls\n",wcc);return 0;
}

输出
在这里插入图片描述

  “由上面的代码和输出可以看出,char和wchar_t在处理单个字符时,定义与赋值和输出都是一样的,但不同的是用wchar_t定义的字符占了两个字节单位大小,char定义的字符占了一个字节单位大小。在处理字符串时,两种数据类型展现了明显的区别,wchar_t类型的字符串在定义时要在字符串前面加’L’,告知编译器,我的类型是‘宽字型’,否则编译器会把字符串当单字符处理只能输出首个字符。而在输出字符串时,宽字符型的格式要用’%ls’而不是‘%s’,这点也要和窄字符char类型区分开。”

这里是引用

  “C语言中除了有以上这些基本数据类型外,还有一些类型的修饰符,在基本数据类型前加上这些修饰符能改变类型的空间大小、符号或取值范围:”

官方文档
在这里插入图片描述

  “这些类型的大小我们可以通过指令sizeof()得到:[code_8]”

#include<stdio.h>
int main()
{short s;long l;int i;char c;float f;double d;printf("short 长度: %d byte\n",sizeof(s));printf("long 长度: %d byte\n",sizeof(l));printf("int 长度: %d byte\n",sizeof(i));printf("char 长度: %d byte\n",sizeof(c));printf("float 长度: %d byte\n",sizeof(f));printf("double 长度: %d byte\n",sizeof(d));return 0;} 

输出
在这里插入图片描述

  “对signed、unsigned、short、long的一些说明:在int类型前面加signed修饰符表示数据是带符号的可以有正有负(默认情况下数据都是带符号的)。在int类型前面加unsigned修饰符表示数据是无符号的只能表示正数。加short表示缩短字节长度,加long则是增大字节长度。”
  “那么我想给大家提个小问题,在用unsigned做修饰符时,只能表示正数,那么原来的负数去哪了呢?在内存中表示负数的那些位数难道是浪费掉了吗?”
  “当然不是,在用unsigned修饰整数型变量时,原本内存中表示负数的位数全都用来表示正数了,也就是说,当我们用unsigned修饰变量时,数据的最大值会提升一倍,而最小值变成了0,就是因为负数已经不存在了,简单来说就是牺牲负数表示正数,正数最大值扩大一倍。例如:[code_9]”

#include<stdio.h>
#include<stdlib.h>
int main()
{int a = INT_MAX; unsigned int a1 = 2*22147483647;printf("INT_MAX=%d\n",a);printf("UNSIGNED INT_MAX=%d\n",a1);return 0;
}

输出
在这里插入图片描述

  “注意:上述在使用INT_MAX查看int最大值时,必须调用头文件stdlib.h。”

int类型最大值的计算方法:
在这里插入图片描述

其他的数据类型大小范围请参考:基本数据类型大小和范围
  “前面我们讲了很多数据类型的知识,下面该讲讲变量了。什么是变量呢?[code_10]”

#include<stdio.h>
int main()
{int a;a = 10;printf("%d\n",a); return 0;} 

输出
在这里插入图片描述

  “如上述代码中的a,就是一个变量。而int是用来定义a的数据类型。a=10是对a的赋值操作,printf(“%d\n”,a)则是对a的调用。从代码角度看,一个变量其实就这些动作:定义、赋值、调用。(有时赋值和调用也可能没有。)我们在深入点理解,其实定义就是在内存空间中开辟出一块空间大小用来存储变量,赋值就是在这块新开辟的空间中存入一个数据值,而调用就是把这块空间的数据拿到别的地方进行处理(运算或者赋值)。”
  “说的再简单点,此时我们想像内存就是一个大仓库,变量就是在这个仓库中存放的一个箱子。这个箱子的颜色、大小都由定义箱子的数据类型决定。而箱子里放不放东西,由是否对变量进行赋值决定。”

  如图,变量-(具象)->箱子:
在这里插入图片描述

  “上面这个图我们就可以理解为,在内存中开辟了一块int类型大小的空间(4byte),并给这个空间取名字为“a”,a里面的值是‘123’。代码表示:[code_11]”

#include<stdio.h>
int main()
{int a;a = 123;return 0;} 

  “那么据此,其他的数据类型的变量也都同理。假设占用空间的大小作为箱子的尺寸,那么变量在内存的定义可以用下图表示:”

在这里插入图片描述

  “把不同数据类型的变量比作不同颜色、尺寸的箱子,把内存比作是存放箱子的仓库,我认为这是目前最通俗易懂的理解方法。但这样我就有个问题了,这些箱子在仓库中是随便放的,还是按要求摆在不同区域呢?大家可以思考一下这个问题,答案会在下次课中揭晓。”

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习——聚类分析

文章目录聚类分析K-means算法K-中心算法DBSCAN算法聚类分析 K-means算法 算法简要步骤 随机选取K个样本点&#xff08;不一定来自样本数据&#xff09;作为初始的质心第一次迭代&#xff0c;将所有样本分配到这K个类中 对每个样本计算其到两个聚类中心的欧式距离&#xff08;…

2022年12个最佳WordPress备份插件比较

您是否正在寻找可靠的WordPress备份插件来定期备份您的网站&#xff1f; 备份就像您网站的安全网。每当您的网站因任何原因崩溃时&#xff0c;您都可以快速恢复您的网站。但是您需要确保您的备份具有最新的更改&#xff0c;否则您可能会丢失重要数据。一个好的备份插件将确保您…

艾美捷藻红蛋白RPE化学性质文献参考

艾美捷藻红蛋白RPE背景&#xff1a; R-藻红蛋白是从海藻&#xff08;甘紫菜或高氏肠枝藻&#xff09;分离的藻胆蛋白家族成员。从红藻中分离得到 R- 藻红蛋白(PE)。其主吸收峰位于565nm&#xff0c;次吸收峰位于496nm 和545nm。次级峰的相对显著性在不同种的 R-PE 中差异显著。…

前端开发学习之【Vue】-下

文章目录Vuex1.概述2.使用3.四个 map 方法4.模块化命名空间Vue Router1.SPA2.路由3.基本使用4.多级路由5.路由传参query参数6.命名路由7.路由传参params参数8.路由的props配置9.路由跳转方式10.缓存路由11. activated deactivated生命周期钩子12.路由守卫13.路由器的两种工作模…

极限多标签算法: FastXML 的解析

文章目录前言1.关于极限多标签 (XML: eXtreme multi-label Classification)1.1 流派1.2 评价指标2.FastXML2.1 FastXML的特点2.2 FastXML的局部性2.3 FastXML的拟合目标2.4 通过代码分析FastXML的拟合细节2.4.1 r\mathbf{r}^{}r的优化与拟合2.4.2 δ\deltaδ的优化与拟合 ---- …

知识图谱-命名实体-关系-免费标注工具-快速打标签-Python3

知识图谱-命名实体-关系-免费标注工具-快速打标签-Python3一、功能介绍1、代码文件夹结构2、运行环境3、自定义命名实体、关系模板4、导入文件5、选择自定义实体和关系文件6、文本标注7、撤销和取消标注8、导出和导出并退出系统9、导出文件后解析10、标注规范和KG规范11、系统提…

SQL学习二十、SQL高级特性

约束&#xff08;constraint&#xff09; 管理如何插入或处理数据库数据的规则。 DBMS 通过在数据库表上施加约束来实施引用完整性。 大多数约束是在 表定义中定义的&#xff0c;用 CREATE TABLE 或 ALTER TABLE 语句。 1、主键 &#xff08;PRIMARY KEY&#xff09; 主键是…

AMCL代码详解(六)amcl中的重采样

1.重采样判断 上一章讲述了amcl中如何根据激光观测更新粒子权重&#xff0c;当粒子更新完后amcl会需要根据程序判断是否需要进行重采样。这个判断在粒子观测更新权重后进行判断&#xff0c;代码在amcl_node.cpp中&#xff1a; if(!(resample_count_ % resample_interval_)){ p…

[GYCTF2020]Easyphp

尝试了一下万能密码不行&#xff0c;又到处翻了一下&#xff0c;扫目录结果又有www.zip 审计代码好久&#xff0c;序列化和sql结合的题还是第一次见&#xff0c;太菜了呀&#xff0c;花了很久时间才理解这个题 首先看到update.php&#xff0c;这个文件是最亮眼的&#xff0c;…

javascript 原生类 DOMParser 把 字符串格式的HTML文档源码 转换成 document DOM对象

文章目录IntroQADOMParser 在 console 的使用cheerio 在 node 项目中的使用Reference测试sumIntro 有一天我在写爬虫。 其实也说不上是爬虫&#xff0c;就是打开浏览器上网&#xff0c;觉得页面有些数据挺有意思&#xff0c;就打开开发者工具&#xff0c;在 Network/Console 中…

01.初识C语言1

一、前期准备 1.gitee网址&#xff08;代码托管网站&#xff09;&#xff1a;工作台 - Gitee.com Git教程 - 廖雪峰的官方网站 (liaoxuefeng.com) 用法&#xff1a; 1&#xff09;新建仓库 2&#xff09;随意勾选 3&#xff09;网络仓库构建完成 2.所学知识&#xff1a;计算…

【期末大作业】基于HTML+CSS+JavaScript网上订餐系统(23个页面)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

Jetson Orin 平台单进程采集四路独立video调试记录

1. 概述 现在有4个摄像头, 如何捕获4个摄像头(/dev/video0 - video3)在一个进程像这样: 现在只能捕捉一个相机使用gst-launch如下: gst-launch-1.0 v4l2src device=/dev/video0 ! video/x-raw,width=1280,height=720 ! videoconvert ! video/x-raw,format=I420 ! xvimagesi…

《设计模式:可复用面向对象软件的基础》——行为模式(2)(笔记)

文章目录五、行为模式5.5 MEDIATOR(中介者)1.意图补充部分2.动机3.适用性4.结构5.参与者6.协作7.效果8.实现9.代码示例10.相关模式5.6 MEMENTO ( 备忘录)1.意图2.别名3.动机4.适用性5.结构6.参与者7.协作8.效果9.实现10.代码示例11.相关模式5.7 OBSERVER (观察者)1.意图2.别名3…

21.C++11

C11的官网&#xff1a;C11 - cppreference.com 1.C11简介 在2003年C标准委员会曾经提交了一份技术勘误表(简称TC1)&#xff0c;使得C03这个名字已经取代了C98称为C11之前的最新C标准名称。不过由于TC1主要是对C98标准中的漏洞进行修复&#xff0c;语言的核心部分则没有改动&am…

Java语言实现猜数字小游戏

之前笔者在学习C语言的初级阶段&#xff0c;就已经实现了用C语言简单实现猜数字小游戏&#xff0c;既然笔者最近在学习Java的初级阶段&#xff0c;那么&#xff0c;也应该写一个Java语言实现的猜数字小游戏&#xff01;&#xff01; C语言实现猜数字小游戏&#xff1a;原文链接…

浏览器播放rtsp视频流:4、jsmpeg+go实现局域网下的rtsp视频流web端播放

文章目录1.前言2.资料准备3.兼容性及适用性说明4.jsmpeg架构5.基于以上架构的go方案可行性分析6.编译和结果展示&#xff08;编译坑点&#xff09;7.最后1.前言 之前的rtsp转webrtc的方案存在如下缺陷&#xff1a;1.只支持h264&#xff1b;2.受限于webrtc的理解难度以及搭建tu…

Hproxy项目前端

hproxy项目前端使用vue-element-admin框架&#xff0c;页面为hook列表&#xff0c;和一个添加hook页面。 添加路由 编辑src/router/index.js文件&#xff0c;在constantRoutes列表追加如下路由内容 {path: /hproxy,component: Layout,redirect: /hproxy/index,hidden: false,c…

各省市软考准考证打印时间,一起来看!

距离软考还有一周&#xff0c;各个省市的准考证也开始打印了&#xff01; 各地防疫政策一定要遵守&#xff0c;不然错过&#xff0c;又等一年&#xff01; 周末也有一些省市因疫情推迟、取消考试的。 一起来看&#xff01; 考完之后&#xff0c;会在这里讨论一些答案&#x…

UWB室内定位系统铸造智能化企业安全管理系统

进入工业4.0时代以来&#xff0c;数字技术不断成熟、扩散和融合&#xff0c;加速推动工业企业数字化、智能化转型。企业推进数字化转型要整体规划、分布实施&#xff0c;需要考虑企业经营管理活动的全过程、全范围、全层级。各大行业已经开始配备UWB人员定位系统&#xff0c;提…