返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >c语言深度解剖(数据类型关键字)
  • 434
分享到

c语言深度解剖(数据类型关键字)

2023-06-03 10:06:07 434人浏览 泡泡鱼
摘要

1. 前面说点话上一个章节嵌入式linux:C语言深度解剖(入门篇)zhuanlan.zhihu.com写完后,很多看完的人都想把我按在地上摩擦,咬牙切齿不足解恨,但是也有很多人表示支持,在此,鄙人表示感谢。这个章节说下C语言的关

1. 前面说点话

上一个章节

嵌入式linuxC语言深度解剖(入门篇)

zhuanlan.zhihu.com

写完后,很多看完的人都想把我按在地上摩擦,咬牙切齿不足解恨,但是也有很多人表示支持,在此,鄙人表示感谢。

这个章节说下C语言的关键字

我很想好好说下这个章节,主要是很多人不知道数据如何在内存里面存储的,而且什么是内存,很多初学者也不理解,内存可以理解成很多很多个格子,比如1G的内存,就有1024x1024x1024 byte个格子,每个格子里面都有8个小格子,而且每个格子都有自己的编号,这样想就没那么复杂了,数据类型就是把各种各样的数据保存在这些格子里面。

如何存?怎么存?就跟不同的数据类型有关系了

 

什么是关键字?

C语言有多少个关键字?

关键字要跟编译器联系起来,比如int关键字,我写了个( int i = 0;)编译器就知道int这个家伙是认识的,编译器就会给int 修饰的变量分配一个房子,比如说这个房子有四个字节。

C语言有32个关键字

c语言深度解剖(数据类型关键字)

 2. C语言的关键字(数据类型关键字)

数据类型关键字一共有12个,分别是下面

字符类型

(1) char :声明字符型变量或函数

数值类型

(1) double :声明双精度变量或函数

(2) float:声明浮点型变量或函数

(3) int:声明整型变量或函数

(4) long :声明长整型变量或函数

(5) short :声明短整型变量或函数

构造类型

(1) enum :声明枚举类型

(2) struct:声明结构体变量或函数

(3) uNIOn:声明联合数据类型

有符号型和无符号型

(1) unsigned:声明无符号类型变量或函数

(2) signed:声明有符号类型变量或函数

 

什么是数据类型?

我相信很多人有疑问,或者很多人自信满满觉得自己对数据类型非常懂,在我看来就是由不同的格子组成的,最最最基本的数据类型是char ,char数据类型就有一个格子(一个字节),像下面这样

c语言深度解剖(数据类型关键字)

char数据类型的一个格子

先说char数据类型

这个格子能装多少东西呢?这是我们最想知道的,编译器告诉你这个格子可以装二进制数0B11111111,里面有8个小格子,每个格子里面的东西是未知的。

<img src="https://pic4.zhimg.com/v2-1d8e0ca353ee26aa6a1411a0a3ff849f_b.jpg" data-size="nORMal" data-rawwidth="84" data-rawheight="88" width="84">

c语言深度解剖(数据类型关键字)

一个格子里面装的东西示意图

如果里面装的是0B11111111,那这个格子应该是这个样子的,对应的十进制就是255

c语言深度解剖(数据类型关键字)

上面说了char,下面说unsigned signed

上面说了,一个大格子里面有8个小格子,但是8个小格子是有顺序编号的,就是0~7

c语言深度解剖(数据类型关键字)

 

比如一个数字0B 11111111 ,这个我们都知道是 =256,

定义

无符号数(unsigned)无符号数只能表示非负数(及正数)。

有符号数(signed)可以表示任何类型规定范围内的数。

8个小格子,我们需要有一个格子来告诉编译器,这个大格子装的数据是有符号型的还是无符号类型。编译器指定最高位的格子第8个格子表示符号位

所以

unsigned char i;

表示的大小是0~255,一共256个数字

signed char i;

表示的大小是- c语言深度解剖(数据类型关键字) ~c语言深度解剖(数据类型关键字)  =-128~127,其中包括,也是256个数字

小例子

#include"stdafx.h"

 

intmain(intarGCchar*argv[])

{

 

     unsignedchar=;

     signedchar=;

     int=;

     for(k=;k<300;k++)

     {

        i++;

        j++;

       printf("%4d %4d\t",i,j);

     }

     return;

}

 

c语言深度解剖(数据类型关键字)

从图上可以看到,j最大值是127,i最小值是,i最大值可以达到255,j最小值是-128。

变量在内存里怎么保存的,看看下面这个图片

c语言深度解剖(数据类型关键字)

我们上面把char unsigned signed 搞定之后,我们再来看看其他的数据类型

数值类型

(1) double :声明双精度变量或函数

(2) float:声明浮点型变量或函数

(3) int:声明整型变量或函数

(4) long :声明长整型变量或函数

(5) short :声明短整型变量或函数

 

既然我们知道了char是一个格子,那么double,float,int,long,short是多少个格子呢?

这时候,我们就需要用到一个关键字sezeof,这个关键字是用来确定对象的大小的,然后我们把上面的代码改一下

#include"stdio.h"

 

 

intmain(intargc, char*argv[])

{

     

     charx1 =;

     int  x2 =;

     shortx3 =;

     longx4 =;

     double  x5 =;

     floatx6 =;

 

     printf("char %d int %d short %d long %d double %d float %d\n"\

         ,sizeof(x1),sizeof(x2),sizeof(x3),sizeof(x4),sizeof(x5),sizeof(x6));

     

     return;

}

输出如图

c语言深度解剖(数据类型关键字)

所以我们可以知道

int 类型和long,float类型的格子大小如下

c语言深度解剖(数据类型关键字)

double类型的格子大小如下

c语言深度解剖(数据类型关键字)

short类型的格子大小如下

c语言深度解剖(数据类型关键字)

char类型的格子大小如下

c语言深度解剖(数据类型关键字)

好了,到这里了,大家想想看

char char i = 0 ;

i占领的格子大小有多少呢?有没有这样的写法呢?

c语言深度解剖(数据类型关键字)

看上面的图片,char char i =0;是编译不通过的,但是你想过int int ,long long ,short short,long double呢?

为什么会编译出错呢?

说太多会有别人说我装逼厉害,有一种东西叫做编译器,编译器就像我们人类的法律一样,规定什么可以做什么是违法的,人类有很多种国家的法律,有些国家的法律允许一个老公娶几个老婆,当然,编译器也有很多个,这个自行百度。

 

说完数值数据类型,下面就开始说

构造类型

(1) enum :声明枚举类型

(2) struct:声明结构体变量或函数

(3) union:声明联合数据类型

 

先说枚举类型enum

enumunion_type_age{

     UNION_AGE_1=10,

     UNION_AGE_2,

     UNION_AGE_3

}union_var_age;

enum是关键字,union_type_age说明是这个整体,是这个枚举变量的类型,就像一个户口本,有一个户主的名字一样,比如小明家的爸爸叫做小宝,小宝是小明家的户主,别人会这样说,小宝家的小明,小宝家的XX之类的。

里面的UNION_AGE_1=10, UNION_AGE_2, UNION_AGE_3 是这个枚举类型的数值,它们是const常数类型的,只能在初始化的时候取设定它的值。

union_var_age是枚举类型的变量,它的值只能取花括号里面的数据。

 

用下面的一个小程序理解上面的内容,不理解的请留言

#include"stdio.h"

 

enumunion_type_age{

     UNION_AGE_1=10,

     UNION_AGE_2,

     UNION_AGE_3

}union_var_age;

 

 

intmain(intargc, char*argv[])

{

     

     printf("enum %d\n",sizeof(enum));

     

     union_var_age =UNION_AGE_2;

     printf("union_var_age %d\n",union_var_age);

     return;

}

再说结构体struct 数据类型

这个关键字的数据类型太厉害了,学过c++都知道C++是面向对象的语言,但是linux内核下面有很多通过c实现面向对象的,其中struct起到了非常重要的作用,struct可以把很多不一样的数据类型统一成一个整体去使用。

#include"stdafx.h"

#include"stdio.h"

 

structstr_cpu{

     intage;

     char*name;

     doublef;

}str_t;

 

 

intmain(intargc, char*argv[])

{

     str_t.age =10;

     str_t.name ="Linux";

     str_t.f =1.077;

 

     printf("str_t.age %d str_t.name %s str_t.f %f\n",str_t.age,str_t.name,str_t.f);

     return;

}

跟枚举一样strcpu这个指的是结构体花括号里面的所有东西,结构体变量名字的大小是花括号里面所有变量大小的总和,你可以用sizeof(strcpu)看看它的大小,str_cpu的大小是里面大小的总和(16个字节),但是枚举类型那个名字的大小却不一样,只有他自己的大小(4个字节)。

#include"stdio.h"

 

intadd(inta,intb)

{

     return(a+b);

}

 

typedefstructstr_cpu{

     intage;

     char*name;

     doublef;

     int(*func)(int,int);

}str_t;

 

str_t m_str_t;

str_t*str_p =&m_str_t;

 

intmain(intargc, char*argv[])

{

     

     m_str_t.age =10;

     m_str_t.name ="Linux";

     m_str_t.f =1.077;

     m_str_t.func =add;

 

     

     printf("%d %d %s %f\n",m_str_t.age,m_str_t.func(5,9),m_str_t.name,m_str_t.f);

     str_p->age =12;

 

     printf("str_p->age = %d\n",str_p->age);

     

     return;

}

union 数据类型

union数据类型关键字的用法与struct的用法非常相似,union维护足够多的空间来放置成员的一种。

在union中,所有的数据成员公用一个空间,同一个时间只能存储其中一个数据成员,所有成员变量的起始地址都是一样的

#include"stdio.h"

 

unionCpuMachine

{

    charname;

    intnumber;

    char*str;

    doubletime;

}UnionCpu;

 

intmain(intargc, char*argv[])

{

     printf("UnionCpu %d double %d\n",sizeof(UnionCpu),sizeof(double));

     ret

urn;

}

看上面的例子,union最大的数据是double ,所以CpuMachine的长度也是double的长度。

c语言深度解剖(数据类型关键字)

但是在内存里如何组织这个大小的呢?

我们用一个视频来体验一下下面的代码

#include"stdio.h"

 

unionCpuMachine

{

    charname;

    intnumber;

    char*str;

    doubletime;

}UnionCpu;

 

intmain(intargc, char*argv[])

{

     UnionCpu.name =0x55;

     UnionCpu.number =500;

     UnionCpu.str ="Microsoft Visual";

     UnionCpu.time =1.5678;

 

     printf("UnionCpu %d double %d\n",sizeof(UnionCpu),sizeof(double));

     return;

}

每次单步执行之后,共用体之后的值把之前的值给覆盖了,一个时间点后,共用体只能保存一个值。

 

问题:

数据类型是有不同大小的格子来组成的,那么不同的数据类型型格子保存在哪里呢?是由谁来决定的呢?

说下下面代码的输出是多少?

#include"stdio.h"

 

unionCpuMachine

{

    inti;

    chararray[2];

}UnionCpu;

 

intmain(intargc, char*argv[])

{

     UnionCpu.array[] =0x55;

     UnionCpu.array[1] =0x33;

 

     printf("i 0x%x\n",UnionCpu.i);

     return;

}

 

看完觉得有收获的,请帮忙点赞支持

--结束END--

本文标题: c语言深度解剖(数据类型关键字)

本文链接: https://lsjlt.com/news/233980.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • c语言深度解剖(数据类型关键字)
    1. 前面说点话上一个章节嵌入式Linux:c语言深度解剖(入门篇)zhuanlan.zhihu.com写完后,很多看完的人都想把我按在地上摩擦,咬牙切齿不足解恨,但是也有很多人表示支持,在此,鄙人表示感谢。这个章节说下C语言的关...
    99+
    2023-06-03
  • C语言数据类型与sizeof关键字
    目录一、前言二、数据类型1、数据类型有哪些2、为什么要有数据类型3、如何看待数据类型三、sizeof – 计算不同类型变量开辟空间的大小1、内置类型开辟的空间大小2、自定...
    99+
    2024-04-02
  • C语言深度解剖篇之关键字以及补充内容
    目录关键字分类补充内容第一个C程序定义与声明变量变量的分类变量的作用域变量的生命周期作用域 vs 生命周期最宽宏大量的关键字 - auto最快的关键字 - register存储金字塔...
    99+
    2024-04-02
  • 深度理解C语言中的关键字static
    目录一、函数和变量的多文件问题1.1.为什么全局变量和函数需要跨文件访问二、static修饰变量和函数2.1.static修饰全局变量2.2.static修饰局部变量2.3.为什么局...
    99+
    2024-04-02
  • 深入了解Go语言中的关键字和Windows数据类型。
    Go语言是一门快速、简洁、安全的编程语言。它具有高效的并发性、垃圾回收机制和强大的类型系统。在这篇文章中,我们将深入了解Go语言中的关键字和Windows数据类型,以帮助您更好地了解这门语言。 一、Go语言中的关键字 Go语言中的关键字是指...
    99+
    2023-09-12
    windows 数据类型 关键字
  • C语言数据类型与sizeof关键字实例分析
    这篇文章主要介绍“C语言数据类型与sizeof关键字实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言数据类型与sizeof关键字实例分析”文章能帮助大家解决问题。一、前言介绍C语言当中的...
    99+
    2023-06-30
  • 剖析C语言关键字之void,const,return
    目录returnvoid一.可做为函数的通用接口二.void不能修饰变量三.void修饰函数返回值const总结return 首先我们弄清楚c语言内存分配的方式 然后我们看一段代码...
    99+
    2024-04-02
  • C语言深入讲解之从函数栈帧角度理解return关键字
    目录初识函数栈帧return个人总结环节初识函数栈帧 如上图可见,函数在被调用的时候会现在栈上开辟一个空间,我们称之为栈帧,之后函数内部的变量在这块区域进行空间开辟。 但是函数在调...
    99+
    2024-04-02
  • c语言中提供的合法数据类型关键字有哪些
    c语言中提供的合法数据类型关键字有:char:声明字符型变量或函数。double:声明双精度变量或函数。enum:声明枚举类型。float:声明浮点型变量或函数。int:声明整型变量或函数。long:声明长整型变量或函数。short:声明短...
    99+
    2024-04-02
  • C语言中volatile关键字的深入讲解
    1. 什么是volatile关键字? volatile用于声明一个变量,告诉编译器该变量值容易发生改变,在编译、读取、存储该变量的时候都不要做任何优化,因此编译后的程序每次需要存储...
    99+
    2024-04-02
  • 深度剖析Go语言的数据结构
    深入探究Go语言的数据结构,需要具体代码示例 数据结构是计算机科学中非常重要的概念,它涉及到如何组织和存储数据,以方便程序对数据的操作和处理。在Go语言中,有许多内置的数据结构可以直接使用,例如数组、切片、映...
    99+
    2024-01-18
    Go语言 数据结构 深入探究
  • R语言数据类型深入详解
    R语言用来存储数据的对象包括: 向量, 因子, 数组, 矩阵, 数据框, 时间序列(ts)以及列表 意义介绍 1. 向量(一维数据): 只能存放同一类型的数据 语法: c(dat...
    99+
    2024-04-02
  • GO 语言:如何定义实时关键字的数据类型?
    在计算机科学中,实时关键字是指在特定时间内非常重要的数据,比如股票市场数据、气象数据、交通数据等。这些数据需要及时地被处理和分析,以便及时地做出决策。GO 语言是一种非常适合处理实时关键字的语言,本文将介绍如何定义实时关键字的数据类型。 ...
    99+
    2023-08-12
    实时 关键字 数据类型
  • C语言Static 关键字解析
    目录01简述02static关键字作用01简述 static关键字在嵌入式C语言当中很简单,它有三个作用: 作用一:在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变...
    99+
    2024-04-02
  • 了解Go语言中Windows数据类型和关键字的基础知识。
    Go语言是一门高效、可靠、简单的编程语言。它是一种编译型语言,旨在提供快速的编译速度和高效的执行速度。Go语言提供了跨平台的支持,包括Windows操作系统。本文将为大家介绍在Go语言中Windows数据类型和关键字的基础知识。 一、Win...
    99+
    2023-09-12
    windows 数据类型 关键字
  • 深入理解Go语言的数据类型
    go 语言的数据类型决定了变量可存储的数据类型和操作,包括基本数据类型(布尔、整数、浮点数、复数、字符串、rune、字节)和复合数据类型(数组、切片、映射、结构体、接口)。go 语言支持...
    99+
    2024-04-08
    数据类型 go go语言 键值对 隐式转换
  • 深入聊聊C语言中的Const关键字
    目录前言01const简述02常量的应用常量作为函数的参数C++中应用加const03#define和const总结前言 const是一个C语言的关键字,它限定一个变量不允许被改变。...
    99+
    2024-04-02
  • C语言深入探索数据类型的存储
    目录数据类型介绍类型的基本归纳整型家族浮点数家族构造类型指针类型空类型整型在内存中的存储原码,反码,补码大小端浮点数在内存中的存储浮点数存储的规则数据类型介绍 首先,对于我们C语言中...
    99+
    2024-04-02
  • C语言关键字总结解析
    C语言关键字总结 1.关键字变更历史 1999年12月16日,ISO推出了C99标准,该标准新增了5个C语言关键字: inline restrict _Bool _Complex _...
    99+
    2024-04-02
  • C语言关键字之autoregister详解
    目录一:auto作用域生命周期auto二:register总结:一:auto 在学习关键字auto之前我们需要先了解两个概念:作用域和生命周期。 作用域 作用域(scope)是程序设...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作