01 数据类型:

为什么有数据类型?

现实生活中的数据太多而且大小形态不一。

数据类型与内存的关系:

数据类型的本质:创建变量的模具,是固定大小的别名。

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
int main() {
int a;
int b[10];
printf("b:%d,b+1:%d,&b:%d,&b+1:%d \n",b,b+1,&b,&b+1);
//b:6422152,b+1:6422156,&b:6422152,&b+1:6422192
system("pause");
}

问题:b,&b所代表的数据类型不一样:

b代表的是数组首元素的地址,&b代表的是整个数组的地址。&b+1,相当于给整个数组加了1个数组大小的地址。

重点:(数组数据类型:1.定义;2.数组指针;3.数组类型和数组指针类型的关系)

数组的大小:

printf("sizeof(b):%d",sizeof(b));//40
printf("sizeof(a):%d",sizeof(a));//4

数据类型的作用:编译器预算对象分配的内存空间大小。

数据类型的别名:typedef

struct Teacher{
char name[30];
int age;
} main:
struct Teacher t1;//没有struct关键字会报错
t1.age = 3;

自定义数据类型:typedef

typedef struct Teacher{
char name[20];
int age;
}Teacher; main:
struct Teacher t1;//没有struct关键字不会报错
t1.age = 31;

c语言中会报错,c++中增强了struct关键字。会没有问题。

数据类型的封装

1.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 );

2.void修饰函数返回值和参数,仅表示无。

如果函数没有返回值,那么应该将其声明为void型

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

int function(void) {

return 1;

}

3.void指针的含义:

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

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

void
指针作为右值赋值给其它指针时需要强制类型转换

      int *p1 = NULL;
char *p2 = (char *)malloc(sizoeof(char)*20);

变量本质分析

变量概念:即能读又能写的内存对象,若一旦初始化不能修改的对象是常量。

变量的本质:

1.程序通过变量名来申请和命名空间

2.通过变量名访问内存空间(一段连续)内存空间的别名(犹如门牌号)

3.修改变量的方法:

1.直接(赋值法)eg:int a = 78;

2.间接。内存有地址编号,通过地址编号可以修改内存;

int a;
int b;
int *p;
a = 10;//直接修改
printf("&a:%d\n",&a);//获取到a的地址1245024
//间接修改====直接通过内存修改
*((int*)1245024) = 200;//int* 表示类型,*()代表作指针
printf("a:%d\n",a);//200
{
p = 1245024;
*p = 300;//间接赋值 通过指针修改
}
printf("a:%d\n",a);//300

4.对内存空间能取别名.....

5.数据类型和变量的关系:通过数据类型定义变量

总结:

1.对内存,可读可写;

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

3.不是向变量读写数据,而是向变量所代表的内存空间中写数据。(变量跑哪去了?变量有变量的存储空间);

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

思考2:C++编译器是如何管理函数1,函数2变量之间的关系的?

程序内存四区模型

内存四区的流程:

硬盘(程序)>>内存(代码,操作系统代码)=>>执行过程中,C程序内存管理(堆区,栈区,全局区,代码区)

流程说明:

1.操作系统把物理硬盘代码load到内存

2.操作系统把c代码分成四个区

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

各区元素分析:

1.栈区(stack):由编译系统自动分配释放,存放函数的参数值,局部变量的值等。

2.堆区(heap):一般由程序员分配释放(动态内存申请与释放)如程序员不释放,程序结束时可能操作系统回收。

3.全局区(静态区)(static):如果存储的值一样,c++编译器会自动保留一份。

1.全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,该区域在程序结束后有操作系统释放。

2.常量区:字符串常量和其他常量的存储位置,程序结束后有操作系统释放。

4.程序代码区:存放函数的二进制代码。

#define  _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <string.h>
#include <stdio.h> char *getStr1()
{
char *p1 = "abcdefg2";
return p1;
}
char *getStr2()
{
char *p2 = "abcdefg2";
return p2;
} void main()
{
char *p1 = NULL;
char *p2 = NULL;
p1 = getStr1();
p2 = getStr2(); //打印p1 p2 所指向内存空间的数据
printf("p1:%s , p2:%s \n", p1, p2); //打印p1 p2 的值
printf("p1:%d , p2:%d \n", p1, p2);//竟然是相等的 printf("hello...\n");
system("pause");
return ;
}

C_深入(内存模型)的更多相关文章

  1. Java内存模型深度解析:总结--转

    原文地址:http://www.codeceo.com/article/java-memory-7.html 处理器内存模型 顺序一致性内存模型是一个理论参考模型,JMM和处理器内存模型在设计时通常会 ...

  2. JVM学习(3)——总结Java内存模型

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: 为什么学习Java的内存模式 缓存一致性问题 什么是内存模型 JMM(Java Memory Model)简 ...

  3. 浅析java内存模型--JMM(Java Memory Model)

    在并发编程中,多个线程之间采取什么机制进行通信(信息交换),什么机制进行数据的同步? 在Java语言中,采用的是共享内存模型来实现多线程之间的信息交换和数据同步的. 线程之间通过共享程序公共的状态,通 ...

  4. JMM(java内存模型)

    What is a memory model, anyway? In multiprocessorsystems, processors generally have one or more laye ...

  5. 《深入理解Java内存模型》读书总结

    概要 文章是<深入理解Java内容模型>读书笔记,该书总共包括了3部分的知识. 第1部分,基本概念 包括"并发.同步.主内存.本地内存.重排序.内存屏障.happens befo ...

  6. java内存模型(待完善)

    JMM 1.内存模型的抽象. 本地内存是JMM的一个抽象概念,并不是真实存在,它涵盖了缓存,写缓冲区,寄存器以及其他的硬件和编译器优化. 2.内存可见性问题? ? 3.重排序  编译器优化重排序   ...

  7. Java内存模型及性能优化

    最近在做一个项目的性能优化,遇到好多以前没有关注过的性能问题,一头雾水,今天做个笔记,简单记录下JVM相关的参数设置. 一.JVM内存模型 首先介绍下Java程序具体执行的过程: Java源代码文件( ...

  8. C++11 并发指南七(C++11 内存模型一:介绍)

    第六章主要介绍了 C++11 中的原子类型及其相关的API,原子类型的大多数 API 都需要程序员提供一个 std::memory_order(可译为内存序,访存顺序) 的枚举类型值作为参数,比如:a ...

  9. Java内存模型深度解析:final--转

    原文地址:http://www.codeceo.com/article/java-memory-6.html 与前面介绍的锁和Volatile相比较,对final域的读和写更像是普通的变量访问.对于f ...

  10. Java内存模型深度解析:volatile--转

    原文地址:http://www.codeceo.com/article/java-memory-4.html Volatile的特性 当我们声明共享变量为volatile后,对这个变量的读/写将会很特 ...

随机推荐

  1. OpenGL编程(一)渲染一个指定颜色的背景窗口

    上次已经搭好了OpenGL编程的环境.已经成功运行了第一个程序.可只是照搬书上的代码,并没弄懂其中的原理.这次通过一个小程序来解释使用GLUT库编写OpenGL程序的过程. 程序的入口 与其他程序一样 ...

  2. 51Nod 不重叠的线段(贪心)

    X轴上有N条线段,每条线段有1个起点S和终点E.最多能够选出多少条互不重叠的线段.(注:起点或终点重叠,不算重叠). 例如:[1 5][2 3][3 6],可以选[2 3][3 6],这2条线段互不重 ...

  3. WIFI 概览

      概览 Android 提供默认 Android 框架实现,其中包括对各种 WLAN 协议和模式的支持,这些协议和模式包括: WLAN 基础架构 (STA) 网络共享模式或仅限本地模式下的 WLAN ...

  4. Dia Diagram Editor(流程图、UML)免费开源绘图软件

    近期工作各种繁忙,导致很少分享自己喜欢和常用的一些工具,今天有点时间再次给各位喜欢开源的小伙伴介绍一个好用.免费.开源的软件Dia Diagram Editor. 首先给大家看看这个软件的主界面吧! ...

  5. ubuntu -redis

    ubentu 布置redis,基本操作和CentO感觉相差不多,主要是使用命令有所差异 mark如下: ① download ② tar -zxvf xxx.tar.gz ③ cd redis-xxx ...

  6. caioj 1112 树形动态规划(TreeDP)7:战略游戏

    这道题和上一道题非常相似 这道题是看边,上一道是看点. 但是状态定义不同 看边的话没有不放不安全这种状态 因为当前结点的父亲无法让这颗子树没有看到的边看到 所以这种状态不存在 而上一道题存在不放不安全 ...

  7. POJ——T 1182 食物链

    http://poj.org/problem?id=1182 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 77012   ...

  8. arcgis engine 获取高亮Feature、element

    转自原文 arcgis engine 获取高亮Feature.element IGraphicsContainer pGraphicsC =  mainAxMapControl.Map as IGra ...

  9. JavaScript语言基础3

     JavaScript能够处理一些来自于现实世界的数据类型.比如:数字和文本. 同一时候JavaScript中也包括了一些具 有抽象性质的数据类型.比如对象数据类型. JavaScript它是一种弱类 ...

  10. PHP长整型在32位系统中强制转化溢出

    CleverCode近期遇到一个PHP项目整形转化问题,mysql有一个字段id是bigint的,里面有长整型,如id = 5147486396.可是php代码因为历史原因却部署在多台机器中,当中A机 ...