您的位置:首页 > 编程语言 > C语言/C++

黑马程序员-C语言02

2016-02-13 18:25 197 查看
------- android培训java培训、期待与您交流! ----------

1、fgets() 和 fputs()函数

1、fgets函数是一个文件操作相关的函数,暂时可以用作从键盘接收一个字符串保存到数组中

接收字符串的方法:

1)scanf    缺点是不能接收空格

2)gets可以接收空格,但是提示一个警告,不安全

3)fgets     是一个安全的字符串接收函数

例如:char ch[5];中最多存放4个可见字符,使用fgets时最后自动存放 ‘\0’

使用格式: fgets(数组名,数组长度,stdin); 

当输入的字符串的长度小于数组长度时,fgets会自动接收 回车 

可以通过一行代码去掉多余的 回车 

当输入长度大于数组长度时,自动截断。

2、fputs也是一个文件相关的操作函数

格式:fputs(数组名,stdout)

输出字符串的时候不会自动换行(puts会自动换行)

3、fgets 和 fputs的优缺点

有点:解决了越界访问的问题,自动截取字符串,安全性高,是文件操作函数,功能强大

缺点:不能格式化输入输出

2、const 关键字

1、是一个类型修饰符,像shor、long等修饰符一样

使其修饰的变量变成常量一样不能改变,常类型修饰的变量或对象的值是不能被更新的

有6个作用

如何使用:

1)修饰变量 

可以使用用指针强制修改 const 常量

2)修饰指针变量

作用:1、指向可以变,但指向变量的值不能变。

   2、指向不可变,值可变

   3、指向和值都不能改变

记忆技巧:

const和* 的位置,在* 前,表示值不可变

const和* 的位置,在* 后,表示指向不能改变

const和* 的位置,前后都有,都不能改变

3)修饰数组

3、内存管理 

1、内存的分配方式共有三种:

1、静态分配

2、在栈上分配

3、在堆上分配,也叫动态分配内存

内存的分区 五大区域 

bss段:存放未初始化的全局变量和静态变量

数据段:已初始化的全局变量和静态变量,字符串常量,也叫常量区

代码段:存放执行程序的代码

前三项在代码编译时分配

堆:动态分配的内存段

栈:临时创建的局部变量

后两项在代码运行时分配

2、常见的内存分配函数

内存管理的是用户自己申请的空间

常见的动态分配函数

1)malloc     void * malloc(unsigned size) 

从内存的堆区域分配大小为 size 个字节的连续的内存空间如果成功,返回分配空间的首地址,失败返回 NULL。

如果没有对 malloc申请的空间赋值,初始值为垃圾数(绝大多数是零)

可以使用一个函数为malloc申请的空间进行初始化  memset(p,'A',16);

2)calloc     calloc(块数,长度)    (与分配数组差不多)

同样需要判断是否分配成功

注意:可以帮我们把分配的存储空间 默认值为 0

3)可以扩展内存空间的  relloc  函数 

p = realloc(p,40*sizeof(int))返回值是新空间的地址,可能是原来的地址,也可能是另外一块地址

3、野指针和内存泄露

int * p;

int * p = (int *)malloc(100);

*(p  + 1) = 100;

函数执行完毕后,栈当中的局部变量 p 被释放,但是动态分配的堆中的数据没有被释放,产生内存泄露。如果指针所指向的空间已经被释放掉了,再调用指针时,指针就成为了 野指针。

内存泄露的解决办法:

在释放p指针之前,先释放堆区中的内存空间。

使用free函数    free(要释放空间的首地址); 该函数存放在stdlib头文件中。 

4、指针函数和函数指针

1、指针函数

返回值为指针(地址)的函数就叫指针函数

应用1:返回两个数中大数的地址,注意,值传递和地址传递的区别。

应用2:通过一个指针函数,输入一个1--7的整数,输出对应的星期名。

2、函数指针

存储函数首地址的指针就是函数指针

int sum(int num1,int num2);

int (*p) (int num1,int num2 )

p1 = sum;  sum存放的就是函数在内存中的首地址

注意:声明函数指针时可以省略函数参数的的参数名

3、函数指针的使用

可以使用函数指针间接调用函数,在调用多个函数时更加的方便清晰。

注意:函数指针不能算数运算,移动无意义。

  sum(1,2)  == (* p )(1,2)  == p(1,2)

此处的 * 不能理解为求值运算,只表示一种符号。

5、构造类型

1、结构体
定义方法:

struct  机构体名称{

成员列表;

};

是构造类型中的一种 

2、结构变量 

注意:结构体定义后,计算机并不会给结构体分配内存空间,会在定义定义结构体变量后,分配存储空间

1)在定义结构体的同时定义结构体变量 

2)先定义结构体,再定义结构体变量

3)匿名结构体变量 

结构体变量访问

stu1.name = “adf”;

3、结构体变量的存储原理 

结构体变量占用的内存空间的大小

1)先找对齐模数

占用字节最大的基本数据类型

2)计算结构体变量中每个成员占用的字节和。考虑对齐和补位问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: