黑马程序员-C语言02
2016-02-13 18:25
197 查看
------- android培训、java培训、期待与您交流! ----------
接收字符串的方法:
1)scanf 缺点是不能接收空格
2)gets可以接收空格,但是提示一个警告,不安全
3)fgets 是一个安全的字符串接收函数
例如:char ch[5];中最多存放4个可见字符,使用fgets时最后自动存放 ‘\0’
使用格式: fgets(数组名,数组长度,stdin);
当输入的字符串的长度小于数组长度时,fgets会自动接收 回车
可以通过一行代码去掉多余的 回车
当输入长度大于数组长度时,自动截断。
2、fputs也是一个文件相关的操作函数
格式:fputs(数组名,stdout)
输出字符串的时候不会自动换行(puts会自动换行)
3、fgets 和 fputs的优缺点
有点:解决了越界访问的问题,自动截取字符串,安全性高,是文件操作函数,功能强大
缺点:不能格式化输入输出
使其修饰的变量变成常量一样不能改变,常类型修饰的变量或对象的值是不能被更新的
有6个作用
如何使用:
1)修饰变量
可以使用用指针强制修改 const 常量
2)修饰指针变量
作用:1、指向可以变,但指向变量的值不能变。
2、指向不可变,值可变
3、指向和值都不能改变
记忆技巧:
const和* 的位置,在* 前,表示值不可变
const和* 的位置,在* 后,表示指向不能改变
const和* 的位置,前后都有,都不能改变
3)修饰数组
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头文件中。
返回值为指针(地址)的函数就叫指针函数
应用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)
此处的 * 不能理解为求值运算,只表示一种符号。
定义方法:
struct 机构体名称{
成员列表;
};
是构造类型中的一种
2、结构变量
注意:结构体定义后,计算机并不会给结构体分配内存空间,会在定义定义结构体变量后,分配存储空间
1)在定义结构体的同时定义结构体变量
2)先定义结构体,再定义结构体变量
3)匿名结构体变量
结构体变量访问
stu1.name = “adf”;
3、结构体变量的存储原理
结构体变量占用的内存空间的大小
1)先找对齐模数
占用字节最大的基本数据类型
2)计算结构体变量中每个成员占用的字节和。考虑对齐和补位问题。
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)计算结构体变量中每个成员占用的字节和。考虑对齐和补位问题。
相关文章推荐
- C++静态成员
- 【C语言】C语言运算符
- 【C语言】C语言运算符
- leetcode70题 题解 翻译 C语言版 Python版
- C++对象的赋值和复制
- Windows 下免费的 C++ 开发平台 EasilyGCC 正式发布
- c++11 新特性之 autokeyword
- C++对象的动态建立和释放
- 【C语言】C语言static和extern区别
- 【C语言】C语言static和extern区别
- 【C语言】C语言外部变量和内部变量
- 【C语言】C语言外部变量和内部变量
- 【C语言】C语言局部变量和全局变量
- usaco 2.2.3 runround
- C++实现线程同步的几种方式
- C/C++语言复习一
- usaco 2.1.1 castle
- usaco 2.1.2 frac1
- usaco 1.5.3 sprime
- 使用c语言编写程序:不允许创建第三方变量