数据类型本质分析

数据类型概念

  • "类型"是对数据的抽象;
  • 类型相同的数据有相同的表现形式/存储格式以及相关的操作;
  • 程序中使用的所有数据都必定属于某一种数据类型;

数据类型本质思考

  • 数据类型和内存有关系吗?
    • 数据类型占据大小一定的内存空间.
  • C/C++为什么会引入数据类型?
    • 不同的数据类型所对应的处理方式/行为/应用方面不同.

数据类型的本质

  • 数据类型可理解为创建变量的模具(模子);是固定内存大小的别名。
  • 数据类型的作用:编译器预算对象(变量)分配的内存空间大小
  • 程序举例,如何求数据类型的大小?
    • sizeof(数据类型名);
  • 请问:数据类型可以有别名吗?数据类型可以自定义吗?
    • 可以(typedef);可以(struct);

数据类型大小

int main()

{

int a = 10;

int b[10] ;

printf("int a:%d \n", sizeof(a));

printf("int a:%d \n", sizeof(int *));

printf("int b:%d \n", sizeof(b));

printf("int b:%d \n", sizeof(b[0]));

printf("int b:%d \n", sizeof(*b));

printf("hello.....\n");

getchar();

return 0;

}

sizeof是操作符,不是函数;sizeof测量的实体大小为编译期间就已确定

数据类型别名

int main()

{

//Teacher t1;

printf("Teacher:%d \n", sizeof(Teacher));

printf("u32:%d \n", sizeof(u32));

printf("u8:%d \n", sizeof(u8));

printf("hello.....\n");

getchar();

return 0;

}

编译结果:

test.c: In function 'main':

test.c:5:33: error: 'Teacher' undeclared (first use in this function)

printf("Teacher:%d \n", sizeof(Teacher));

^

test.c:5:33: note: each undeclared identifier is reported only once for each function it appears in

test.c:6:29: error: 'u32' undeclared (first use in this function)

printf("u32:%d \n", sizeof(u32));

^

test.c:7:28: error: 'u8' undeclared (first use in this function)

printf("u8:%d \n", sizeof(u8));

^

说明我们自己不能擅自使用自定义的数据类型,只能按规定使用内建数据类型或者按规定使用自定义类型.

数据类型封装

  • 1、void的字面意思是"无类型",void *则为"无类型指针",void *可以指向任何类型的数据。
  • 2、用法1:数据类型的封装
    • int InitHardEnv(void **handle);
    • 典型的如内存操作函数memcpy和memset的函数原型分别为
      • void * memcpy(void *dest, const void *src, size_t len);
        • void * memset ( void * buffer, int c, size_t num );
  • 3、用法2: void修饰函数返回值和参数,仅表示无。
    • 如果函数没有返回值,那么应该将其声明为void型
    • 如果函数没有参数,应该声明其参数为void
    • int function(void)
    • {return 1;}
  • 4、void指针的意义
    • C语言规定只有相同类型的指针才可以相互赋值
    • void*指针作为左值用于"接受"任意类型的指针
    • void*指针作为右值赋值给其它指针时需要强制类型转换
    • int *p1 = NULL;
    • char *p2 = (char *)malloc(sizoeof(char)*20);
  • 5、不存在void类型的变量
    • C语言没有定义void究竟是多大内存的别名
  • 6、扩展阅读:void类型详解.

数据类型总结与拓展

1、数据类型本质是固定内存大小的别名;是个模具,c语言规定:通过数据类型定义变量。

2、数据类型大小计算(sizeof)

3、可以给已存在的数据类型起别名typedef

4、数据类型封装概念(void 万能类型)

思考1:

C一维数组、二维数组有数据类型吗?int array[10]。 若有,数组类型又如何表达?又如定义?若没有,也请说明原因。

答: C/C++中数组是内置的数据类型,但不是基础数据类型而是构造数据类型,语义上是有限个占据连续物理空间的相同数据元素的有序集合。

数组类型

1、数组类型

2、数组指针

3、数组类型和数组指针的关系

思考2:

C语言中,函数是可以看做一种数据类型吗?

a)若是,请说明原因。并进一步思考:函数这种数据类型,能再重定义吗?

b)若不是,也请说明原因。

    答:数据类型本质是固定内存大小的别名。那么函数在定义编译之后内存大小就固定了,我们能用sizeof()输出,所以它是一种数据类型;同理,他是固定内存大小的别名,当我们重定义函数的时候就很有可能改变它的内存大小。继而违背数据类型的本质。而C++的函数重载实际上只是编译器为我们起名字,实际编译出来的汇编中。函数名依然不同。所以是不能重定义的。

变量本质分析

变量概念

  • 概念:既能读又能写的内存对象,称为变量;若一旦初始化后不能修改的对象则称为常量。
  • 变量定义形式: 类型 标识符, 标识符, … , 标识符 ;
  • 例如:

    int x ;

int wordCut , Radius , Height ;

double FlightTime , Mileage , Speed ;

变量本质

1、程序通过变量来申请和命名内存空间 int a = 0

2、通过变量名访问内存空间:(一段连续)内存空间的别名(是一个门牌号)

  1. 修改变量有几种方法?

    1、直接。

    2、间接。内存有地址编号,拿到地址编号也可以修改内存:于是指针横空出世了!

    3、内存空间可以再取给别名吗?可以,C++的引用。

4、数据类型和变量的关系

通过数据类型定义变量

5、总结及思考题

1:对内存,可读可写;

2:通过变量往内存读写数据;

3:不是向变量读写数据,而是向变量所代表的内存空间中写数据。问:变量跑哪去了?

答:变量只是内存的外显标志,既然可以不经过变量修改值,那么修改的时候变量依然在那里,不为所动。

思考1:变量三要素(名称、大小、作用域),变量的生命周期?

思考2:C++编译器是如何管理函数:

1:函数。

2:变量之间的关系的?

====》引出两个重要话题:

内存四区模型

函数调用模型

重要实验:

int main()

{

//2种方法:通过变量直接操作内存;通过内存编号操作内存

int i = 0;

printf("&i:%d\n", &i);

*((int *)(1245024)) = 10;//发生段错误

printf("i:%d", i);

printf("hello....\n");

getchar();

return 0;

}

程序的内存四区模型

内存四区的建立流程

流程说明

1、操作系统把物理硬盘代码载入到内存

2、操作系统把C代码分成四个区

3、操作系统找到main函数入口执行

各区元素分析

C语言复习:内存模型1的更多相关文章

  1. C语言与内存模型初探

    #include<stdio.h> #include<string.h> int main(){ long long int a = 2<<30; char str ...

  2. 有 va_arg宏 中数组下标-1 引发的思考 - C 语言中内存模型

    va_arg宏,是头文件 stdarg.h 中定义的,获取可变参数的当前参数. #define va_arg(list, mode) ((mode*)(list+=sizeof(mode)))[-1] ...

  3. Java 线程 — JMM Java内存模型

    JMM Java Memory Model,Java内存模型,属于语言级的内存模型 并发编程中存在的问题: 如何通信:用于线程之间交换信息.两种方式:共享内存,消息传递 如何同步:用于控制不同线程间操 ...

  4. (第三章)Java内存模型(下)

    一.happens-before happens-before是JMM最核心的概念.对于Java程序员来说,理解happens-before是理解JMM的关键. 1.1 JMM的设计 从JMM设计者的 ...

  5. 求你了,再问你Java内存模型的时候别再给我讲堆栈方法区了…

    GitHub 4.1k Star 的Java工程师成神之路 ,不来了解一下吗? GitHub 4.1k Star 的Java工程师成神之路 ,真的不来了解一下吗? GitHub 4.1k Star 的 ...

  6. 一个试图了解JVM内存模型的两年经验的初级程序员,透彻!

    所有的编程语言中都有内存模型这个概念,区别于微架构的内存模型,高级语言的内存模型包括了编译器和微架构两部分.我试图了解了Java.C#和Go语言的内存模型,发现内容基本大同小异,只是这些语言在具体实现 ...

  7. C语言 二级指针内存模型①

    //二级指针第一种内存模型 #include<stdio.h> #include<stdlib.h> //说明:①:类似于int a[5]={0},数组名a是一维数组a中首元素 ...

  8. c语言内存模型

    文章一.C语言的内存分配模型 1.程序代码区:存放函数体的二进制代码. 2.全局区数据区:全局数据区划分为三个区域.全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化 ...

  9. C语言 二级指针内存模型混合实战

    //二级指针内存模型混合实战 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #i ...

随机推荐

  1. optparse模块解析命令行参数的说明及优化

    一.关于解析命令行参数的方法 关于“解析命令行参数”的方法我们一般都会用到sys.argv跟optparse模块.关于sys.argv,网上有一篇非常优秀的博客已经介绍的很详细了,大家可以去这里参考: ...

  2. springmvc使用步骤

    1.导包 2.在web.xml文件中配置前端控制器dispatchServlet 3.创建springmvc配置文件springmvc.xml 4.编写controller 5.在springmvc中 ...

  3. 开始创作自己的VR作品——VR故事叙述终极指南

    转自:http://www.52vr.com/article-1870-1.html       在8月份,YouTube Space LA开展了“VR Creator Lab”的活动,为期三个月.参 ...

  4. 代码整洁之道Clean Code 读后感After Reading

    1.有意义的命名 名副其实,避免误导 做有意义的区分,简单明了2.函数 短小,职责单一 别重复自己3.注释 用代码来阐述 可怕的废话4.格式 垂直格式,垂直距离,空范围 横向格式,水平对齐,缩进5.错 ...

  5. 高通平台读写nv总结

    一,引言      1. 什么是NV       高通平台的NV,保存了系统运行过程中各个模块可能用到的一些参数值,它是以单个文件的形式保存在EFS中,但用户是不能随意访问的,只能通过QXDM来进行读 ...

  6. mysql空间类型使用笔记

    创建表,填充测试数据 create table geom1(id int not null auto_increment primary key,geo geometry); )); )); sele ...

  7. CS229 6.12 Neurons Networks from self-taught learning to deep network

    self-taught learning 在特征提取方面完全是用的无监督的方法,对于有标记的数据,可以结合有监督学习来对上述方法得到的参数进行微调,从而得到一个更加准确的参数a. 在self-taug ...

  8. 【Jenkins学习】安装配置和使用(一)

    为了能够频繁地将软件的最新版本,及时.持续地交付给测试团队及质量控制团队,以供评审,所以引入持续集成工具Jenkins,从而实现公司新产品持续集成,自动化部署. 环境准备 ●操作系统:Windows1 ...

  9. 9.纯 CSS 创作一种按钮被瞄准的交互特效

    原文地址:https://segmentfault.com/a/1190000014680999 吃鸡倍镜,哈哈哈 HTML代码: <div class="box"> ...

  10. python中的jion

    on将列表或元组中的每个元素连接起来,举个例子: 1 a = ["hello", "world", "dlrb"] 2 a1 = " ...