一、数据类型的概念

  1. 类型是对数据的抽象
  2. 类型是相同的数据有相同的表示形式、存储格式以及相关的操作
  3. 程序中使用的数据必定属于某一种数据类型

1、算术类型:

包括三种类型:整数类型、浮点类型,枚举型。

其中:

枚举类型:被用来定义在程序中只能赋予其一定的离散整数值的变量。

字符型char:也是整数型,所有的字符都用ASCII码表来表示。

2、void 类型:

类型说明符 void 表明没有可用的值。

3、构造类型:

包括:指针类型、数组类型、结构类型、共用体类型和函数类型(函数是一个特殊的数据类型)

数组类型和结构类型统称为聚合类型。需要注意的是:函数的类型指的是函数返回值的类型。

二、数据类型的本质

  1. 数据类型可以理解为创建变量的模具:是固定内存大小的别名
  2. 数据类型的作用:编译器预算对象份额皮的内存空间大小
  3. 数据类型的大小:sizeof(char);

下面看一下基本数据的占用空间的大小。

#include "stdio.h"

int main(int argc, const char **argv)
{
printf("sizeof(char) = %d\r\n", sizeof(char));
printf("sizeof(int) = %d\r\n", sizeof(int));
printf("sizeof(short) = %d\r\n", sizeof(short));
printf("sizeof(void) = %d\r\n", sizeof(void));
printf("sizeof(float) = %d\r\n", sizeof(float));
printf("sizeof(double) = %d\r\n", sizeof(double));
printf("sizeof(long) = %d\r\n", sizeof(long));
printf("sizeof(char *) = %d\r\n", sizeof(char *));
printf("sizeof(int *) = %d\r\n", sizeof(int *));
printf("sizeof(void *) = %d\r\n", sizeof(void *)); return ;
}

在win下(win10-64位)下运行结果为:

在linux下(x86_64)运行结果为:

其中,编译的时候后面的选项-w,为不显示编译的警告

           相反,-W或者-Wall会显示所有的警告

三、那么数组类型

简单的测试代码如下:

 #include "stdio.h"

 int main(int argc, const char **argv)
{
char b[]; printf("b = %d, b + 1 = %d, &b = %d, &b + 1 = %d\r\n", b, b + , &b, &b + ); printf("sizeof:b = %d, b + 1 = %d, &b = %d, &b + 1 = %d\r\n", sizeof(b), sizeof(b + ), sizeof(&b), sizeof(&b + )); return ;
}

由运行结果可以看出

b&b是一样的,是因为b是数组首元素的地址,也数组的首地址,&b意思就是对整个数组取地址,当然和b是一样的了,此时,b也是一个地址常量;

b+1:在数组首元素基础上偏移一个地址,对于程序上面的char类型数据,偏移量为1,b+1即b[1],所以结果是在b的基础上加1;

&b+1:表示在整个数组的基础上偏移1,也即是跳过整个数组,所以,&b+1的值为b+10。

综上所述:也就是本质不同,b和&b代表的数据类型不一致

        b  代表的是数组收元素的地址

        &b 代表的是整个数据的地址

四、数据类型起别名

        1、typedef unsigned int uint16_t;

        2、#define uint8_t unsigned char

关于typedef和define的具体用法,可以查看:typedef和define的简单说明

五、数据类型的封装

        1、void字面意思是无类型,void *则为无类型指针,void *可以指向任何类型的数据

        2、比如int func(void *handle),可以参考memcpy和memset的函数

        函数原型为:

                void *memcpy(void *dest, void *src, size_t count);

                void *memset(void *buffer, int c, size_t num)

        3、void可以修饰函数的返回值和参数,表示无返回值或者参数

                如果函数没有返回值,则应该声明为void型

                如果没有参数,应该声明参数为void

                比如:int func(void){return 0;}

        4、void指针的意义

                C语言中规定只有相同类型的指针才可以相互赋值

                void*指针作为左值用于接收任意类型的指针

                void*作为右值赋值给其他指针是需要进行数据类型的强制转换

                int p1 = NULL;

                char *p2 = (char *)malloc(sizeof(char) * 20);

        5、C语言中不存在void类型的变量,在C中,没有规定void是多大内存的别名

C语言的数据类型的本质和提高学习的更多相关文章

  1. 16.C语言中数据类型的本质含义是:表示一个内存格子的长度和解析方法。

    数据类型决定长度的含义:我们一个内存地址(0x30000000),本来这个地址只代表1个字节的长度,但是实际上我们可以通过给他一个类型(int),让他有了长度(4),这样这个代表内存地址的数字(0x3 ...

  2. C语言中数据类型的本质

    数据类型可以理解为固定内存大小的别名.比如int类型,就是表示占用4字节的内存. 1 数据类型的大小 用sizeof操作符获得数据类型的大小. 比如 int a[5];   sizeof(a)就可以得 ...

  3. C语言复合数据类型

           C语言数据类型非常丰富,其中结构体的使用非常广泛,也有一点复杂,这一讲我们主要学习结构体的使用方法,同时也会学习到联合.枚举以及typedef的使用,因为结构体最为复杂,使用最广,所以我 ...

  4. JavaScript 引入方式 语言规范 语言基础 数据类型 常用方法 数组 if_else 比较运算符 for while 函数 函数的全局变量和局部变量 {Javascript学习}

    Javascript学习 JavaScript概述 ECMAScript和JavaScript的关系 1996年11月,JavaScript的创造者--Netscape公司,决定将JavaScript ...

  5. C语言中数据类型和变量

    C语言中的数据类型 数据类型的本质,固定大小内存块的别名. 数组名代表数组首元素的地址. 数组首元素的地址,&代表整个数组的地址. 数组数据类型,怎么定义数据数组类型,定义数组类型指针,数组类 ...

  6. c语言中函数调用的本质从汇编角度分析

    今天下午写篇博客吧,分析分析c语言中函数调用的本质,首先我们知道c语言中函数的本质就是一段代码,但是给这段代码起了一个名字,这个名字就是他的的这段代码的开始地址 这也是函数名的本质,其实也就是汇编中的 ...

  7. 谈谈C语言的数据类型

    本文摘要: 本文主要讲述C语言中的数据类型,从基本的数据类型到派生的数据类型,从int ,char ,float double ....到指针,数组,函数,指向指针的指针,指向数组的指针,指向函数的指 ...

  8. C语言的数据类型

    复习之余,做点笔记<C语言之数据类型> 一.整数数据类型 (1)整数数据类型 整数类型 char 字符型变量   1字节(8Bit) short 短整型      2字节(16Bit) i ...

  9. C语言中数据类型的取值范围

    C语言中数据类型的取值范围如下:char -128 ~ +127 (1 Byte)short -32767 ~ + 32768 (2 Bytes)unsigned short 0 ~ 65536 (2 ...

随机推荐

  1. mongodb插入数据获取本次插入的mongodb id

    最近接了一个别人的项目做二次开发,使用php进行mongodb的数据操作时,需要插入数据后得到相应的mongodb 中的id,简单代码如下 $data = array('test' => 'aa ...

  2. spring加载配置新旧方式对比

    老方式 1.首先要配置配置文件,如beans.xml,内容如下: <?xml version="1.0" encoding="UTF-8"?> &l ...

  3. springboot之Filter指定过滤URL的常见问题

    在使用Filter对一些自己指定的URL进行过滤拦截时,经常会出现如下错误: 1. 明明在@WebFilter(urlPatterns={"/app/online"})中过滤的是/ ...

  4. SpringCloud-day07-Feign

    7.Feign 7.1.Feign简介 声明式服务调用Feign简单介绍下: Feign是一个声明式的Web Service客户端,它使得编写Web Serivce客户端变得更加简单.我们只需要使用F ...

  5. 解决mysql连接linux上mysql服务器的问题

    在远程连接mysql的时候,连接不上,出现如下报错:Lost connection to MySQL server at 'waiting for initial communication pack ...

  6. 【练习】Python第四次:实现对文件的增删改查

    一,实现对文件的增删改查 (一),三级菜单的处理结构及退出技巧:使用TAG标记 tag=True while tag: print('leve1') choice=input("level1 ...

  7. ucos中信号量 事件标志 消息队列都怎么用

    信号量 事件标志和消息队列分别应用于什么场景(反正我学的时候有点闹不清,现在总结一下): 信号量和事件标志用于任务同步.详细来说,这个功能可以替代以前裸机中你打一个标记的功能,比如使用了一个定时器,5 ...

  8. Jupyter Notebook 快捷键使用指南

    因为使用Jupyter Notebook用鼠标选择菜单影响效率,遂将快捷命令记录于此 转自:http://blog.konghy.cn/2017/05/04/jupyter-notebook-hotk ...

  9. oracle 按表数据新增一行

    在功能实现时,能尽量用一个sql语句直接实现业务逻辑的话,就不要去写C#代码,便于维护. 以下sql的逻辑是:给明细表新增一条数据,前提是传入的债券代码存在与债券表,否则不新增.此sql返回受影响行数 ...

  10. 认识socket

    socket socket也称套接字,网络编程的基础.一般情况下我不喜欢直接去说socket的函数都是怎么用的,那个很多人都写出来了,而且肯定比我好的有的是. 但是今天想写的是我的理解中,产生sock ...