01 课程回顾

1.指针数组

注意: 对于数组来说,在使用sizeof的时候a和&a[0]是不一样的,

虽然以%x打印出来他们都是地址

2.值传递

int a;

fun(a);

int *****p;

fun(p); // 这个也是值传递,把p的值传过去了 所以是值传递,并没有取地址

3.栈区和字符常量区

a[i] 等价于 *(a+i)

4.局部变量的问题:

5.strcpy虽然第一个参数是指针,但是内部实现是像指针所指向的内存拷贝内容:

6.char *p1 = “hello mike”; 记住这种写法 p1是一个字符型指针 保存的是hello mike字符常量首元素地址

注意:sizeof(p1)是4!

3 字符串常量和字符指针数组

char *p1 = “abc”;

char tmp[100];

strcpy(tmp,p1)

// 不能改p1指向的内存 char const *p1

// p1指向文字常量区的指针变量

char p2[] = “abc”;

char p3[100];

strcpy(p3,”abc”);

// 可以改变数组元素

// 把abc拷贝到数组p2中

// p3=”abc”// err 数组名是常量

// 类比

char a,b,c;

// 指针数组,它是数组,每个元素都是指针,

// 每个元素都是int *,都是指向int

char *p[] = {&a,&b,&c};

char *str1 = “abc”;

char *str2 = “mike”;

char *str3 = “hello”;

//p3,它是数组,它保存了3个字符串的首元素地址

char *p2[] = {“abc”,”mike”,”hello”}

char *p2[3]

p2[0] = “abc”

p2[1] = “mike”

p2[3] = “hello”

04 普通局部变量

作用域:作用的范围

1 普通局部变量

2  static局部变量

3 普通全局变量

4  static全局变量

5 普通函数和static函数的区别

5 课堂答疑:二级指针和字符指针数组的区别

char *p3[] = {“abc”,”mike”,”hello“};

char **p3 = {“abc”,”mike”,”helo”}; //err

char *tmp

char **tmp = &tmp;//ok

//str首元素是什么类型? char *

//&str[0] 代表首元素地址 str等价于&str[0]

char *str[] = {“abc”,”mike”,”hello”};

char **p = str; // char ** 指向char*

char **p = &str[0]

fun(str)

// 如果char *str[]作为函数参数 可以改为char **str

vpod fun(char **p)

// 下面三者等价,编译器都是当作 char **p处理

void fun(char **p)

void fun(char *p[])

void fun(char *p[100])

void fun(int a[])

void fun(int a[100])

void fun(int *a);

结论:只要是形参中的数组都不是数组,而是指针。

6 static局部变量

// 1.static局部变量,是在编译阶段就已经分配空间,(函数没有调用前,已经存在)

// 2.当离开{ },static局部变量不会释放,只有程序结束,static变量才自动释放

// 3.如果static局部变量不初始化,它的值默认为0

(普通局部变量不初始化,它的值默认为随机数)

// 4.只有执行到34行才初始化,static局部变量初始化语句,只会执行一次,但是可以赋值多次

// 5.static变量只能用常量初始化(注意)

int a = 10;

//static int j = a;  // err,使用变量a给static变量初始化(会报错,因为这个东西是在编译阶段进行的,a还没有值

static放在data区

(左边是栈区

(在编译阶段就已经在data区存在了

06 普通局部变量和static局部变量区别:

1、  内存分配和释放

a)       普通局部变量只有执行到定义变量的语句才分配空间

b)       static局部变量在编译阶段(函数还没有执行),变量的空间已经分离

c)       普通局部变量离开作用域{},自动释放

d)       static局部变量只有在整个程序结束才自动释放

2、  初始化

a)       普通局部变量不初始化,值为随机数

b)       static局部变量不初始化,值为0

c)       static局部变量初始化语句只有第一次执行时有效

d)       static局部变量只能用常量初始化

8 普通全局变量

//8、不同文件,普通变量只能定义一次,可以声明多次

09 C语言全局变量的缺陷

声明和定义的区别:

DEFINITION = DECLARATION + SPACE RESERVATION

定义就是声明的同时申请了一段空间

(这样看比较迷 这就是这节课讲的C语言缺陷。)

10 C语言全局变量声明和定义的建议写法

11 全局变量分文件

(使用前应进行声明

当然这种方法不太方便,如果有多个文件都需要引用,建议使用头文件

12 思考题

13 全局变量分文件补充

复习一下,

防止头文件重复包含: 是指, 在同一个文件中,如果一个文件被包含多次,只有第一次有效

注意是指在一个文件中

14 static全局变量

a)       static全局变量和 普通全局变量的区别就是作用域不一样(文件作用域

b)       extern 关键字只适用于普通全局变量

c)       普通全局变量,所有文件都能使用,前提需要声明

d)       static全局变量只能本文件使用,别的文件不能使用

e)       不同文件只能出现一个普通全局变量的定义

f)        一个文件只能有一个static全局变量的定义,不同文件间的static全局变量,就算名字相同,也是没有关系的2个变量

static全局变量和普通全局变量的区别就是作用域不一样(文件作用域)

extern 关键字只适用于普通全局变量

1.  一个文件只能有一个static 全局变量的定义,一个文件不能出现多个

1.  static全局变量只能在当前文件使用

(这个图片中在右边的文件中定义了,在左边使用不了

15 作用域和生命周期总结

静态全局变量只能当前文件用

普通全局变量 所有都能用

如果不做初始化静态全局变量和普通全局变量都是0(局部变量如果不初始化就是随机的)

术语:

static全局变量 内部链接

普通全局变量 外部链接

普通函数和static函数的区别(文件作用域)

a)       所有文件只能有一次普通函数的定义

b)       一个文件可以有一个static函数的定义

a)       普通函数所有文件都能调用,前提是使用前声明

b)       static函数只能在定义所在的文件中使用

16 内存分区介绍

预处理:头文件展开 宏定义展开 条件编译

编译: 做语法检查,编译成汇编代码

生成目标代码 目标代码是不能执行的 (可以用linux的size命令查看

链接,生成可执行程序

text:代码区

data:data区

在程序没有执行前,有几个内存分区已经确定 (已确定不代表已加载内存 只是已经确定

程序只有运行时才会加载到内存:

text(代码区): 只读,函数

data: 初始化数据,全局变量,static变量(全局 局部, 文字常量区(只读

bss: 没有初始化的数据,  全局变量,static变量(全局 局部, 文字常量区(只读

stack(栈区): 普通局部变量,自动管理内存(自动分配空间,自动释放) 运行的时候才有  先进后出的特点

heap(堆区): 手动申请空间,手动释放,整个程序结束,系统也会自动回收。如果程序没结束,没有手动释放,这个堆区空间不会自动释放

当运行程序,加载内存,首先根据前面确定的内存分区(text,data,bss)先加载 然后额外加载两个区(栈区,堆区

总结一下:text(代码区 主要存的是函数代码 data区.bss区存的是全局..文字常量..

栈区、堆区

进程内存结构

栈从上向下,堆从下向上

进程的内存layout  一个进程操作着他自己的虚拟地址空间,区别于其他进程的虚拟地址空

17 栈越界说明

ulimit

18 memset的使用

其实堆区会比栈区大一点儿

strpy()

strncpy()

strcmp()

功能:将s的内存区域的前n个字节以参数c填入

19 memset使用补充

20 memcpy的使用

21 memmove和 memcmp 的使用

(只要有一个比你大我就大,比ascii码

22 指针指向栈区空间

23 指针指向堆空间

24 堆空间使用总结

内存泄漏:动态分配了空间,不释放

内存污染: 非法使用内存

25 释放说明:

calloc (就业班

realloc (就业班

26 堆区空间越界

27 作业

C语言基础 (10) 变量作用域,生命周期 内存结构的更多相关文章

  1. C++ 炼气期之变量的生命周期和作用域

    1. 前言 什么是变量的生命周期? 从变量被分配空间到空间被收回的这一个时间段,称为变量的生命周期. 什么是变量的作用域? 在变量的生命周期内,其存储的数据并不是在任何地方都能使用,变量能使用的范围, ...

  2. C语言-存储类&作用域&生命周期&链接属性

    1.概念解析(1)存储类 a.存储类就是存储类型,也就是描述C语言变量在何种地方存储. b.内存有多种管理办法:栈.堆.数据段.bss段..text段......一个变量的存储类属性就是描述这个变量存 ...

  3. 内存分配、C++变量的生命周期和作用域

    1.内存分配 程序的内存分配有以下几个区域:堆区.栈区.全局区.程序代码区,另外还有文字常量区. 栈区 ——存放局部变量,即由auto修饰的变量,一般auto省略.由编译器自动分配释放.局部变量定义在 ...

  4. C语言变量及其生命周期

    变量类型以及作用域和生命周期 变量的作用域 变量的作用域就该变量可以被访问的区间,变量的作用域可以分为以下四种: 进程作用域(全局):在当前进程的任何一个位置都可以访问 函数作用域:当流程转移到函数后 ...

  5. C语言基础10

    栈区间:在函数内部声明的变量都存放在栈区间,比如int char 数组 结构体 指针,只管申请,系统会自动帮我们回收,收回的时间是作用域结束之后,遵循的原则是"先进后出". int ...

  6. 7、存储类 & 作用域 & 生命周期 & 链接属性

    概念解析 存储类 存储类就是存储类型,也就是描述C语言变量在何种地方存储. 内存有多种管理方法:栈.堆.数据段.bss段..text段······一个变量的存储类属性就是描述这个变量存储在何种内存段中 ...

  7. GO学习-(4) Go语言基础之变量和常量

    Go语言基础之变量和常量 变量和常量是编程中必不可少的部分,也是很好理解的一部分. 标识符与关键字 标识符 在编程语言中标识符就是程序员定义的具有特殊意义的词,比如变量名.常量名.函数名等等. Go语 ...

  8. [转] C++临时变量的生命周期

    http://www.cnblogs.com/catch/p/3251937.html C++中的临时变量指的是那些由编译器根据需要在栈上产生的,没有名字的变量. 主要的用途主要有两类: 1) 函数的 ...

  9. Go语言基础之变量和常量

    Go语言基础之变量和常量 变量和常量是编程中必不可少的部分,也是很好理解的一部分. 标识符与关键字 标识符 在编程语言中标识符就是程序员定义的具有特殊意义的词,比如变量名.常量名.函数名等等. Go语 ...

随机推荐

  1. Disruptor使用

    Disruptor作者,介绍Disruptor能每秒处理600万订单.这是一个可怕的数字. disruptor之所以那么快,是因为内部采用环形队列和无锁设计.使用cas来进行并发控制.通过获取可用下标 ...

  2. nyoj 547 优先队列

    #include<stdio.h> #include<string.h> #include<queue>//水杯盛水问题,用优先队列不断从最小的边缘开始 using ...

  3. [bzoj2789][Poi2012]Letters_树状数组

    Letters bzoj-2789 Poi-2012 题目大意:给定两个字符串A和B,每次交换A中相邻两个数.问至少交换多少次,可以将A变成B. 注释:$2\le n\le 10^6$ 想法:我们发现 ...

  4. springmvc 监听器getWriter() has already been called for this response问题

    springmvc 监听器getWriter() has already been called for this response问题 在监听器中,如果return true,就不要使用 respo ...

  5. Unix(AIX) set命令

    Unix(AIX) set命令,set命令是shell所具有的,不仅仅是aix自己有的: set -o vi  可以用vi方式操作,用来获取已经输入过的命令: 如果希望自动设置,可以在.profile ...

  6. [Python] Create a minimal website in Python using the Flask Microframework

    How to install Flask Use Flask to create a minimal website Build routes in Flask to respond to websi ...

  7. APP_ABI

    在Application.mk文件中有个预定义命令参数APP_ABI,是指明编译与调试的CPU架构. 目前Android系统支持以下七种不同的CPU架构:ARMv5,ARMv7(从2010年起),x8 ...

  8. 实体类中方法名尽量避免set,get,报错com.fasterxml.jackson.databind.JsonMappingException: (was java.lang.NullPointerException)

    自己建了一个实体类 public class MissPoint implements Serializable{ private static final long serialVersionUID ...

  9. Excel 查找某列中的数据在另一列是否存在并输出其他列的数据

    最近在操作Excel文件数据导入数据库时,经常需要检查Excel中哪些数据数据库中已经存在,哪些不存在,然后再将不存在数据库中的Excel数据导入:在此过程中,经常需要操作Excel中的数据,所以.也 ...

  10. BZOJ 1061费用流

    思路: 我们可以列出几个不等式 用y0带进去变成等式 下-上 可以消好多东西 我们发现 等式左边的加起来=0 可以把每个方程看成一个点 正->负 连边 跑费用流即可 //By SiriusRen ...