C语言知识点补充(1)
2017-08-18 10:56
169 查看
指针作为参数,要么是读内存,要么是写内存。
const 指针:可读不可写,封禁(限制)“*”操作里的写内存功能,即:只读,这块内存只能读不能写。
const用于限定函数的参数,当被const修饰,表示该参数仅用于输入。
int avg(const int *p, int len)
{
}
用于显示的指定:该函数是输入参数,在函数里只是读取这个内存,而不会修改这个内存的值。当你不需要修改内存时,在指针前面加const修饰,避免一不小心的错误发生。
const只是限制的是“*”操作,不允许写内存,但是普通指针的加减是没关系的。
但是,在如下语句中:
int * const p=&a中;p是不能被修改的。
指针不可乱用,一定要弄清楚指针指向哪里?指针指向的地址是否有效?当一个指针未赋值时,如:int *p;其值为随机值,指向一个随机的内存地址,称为“野指针(wild pointer)”。
值为0的指针,称为空指针。当指针为空时,不能用"*"操作,但是空指针在在if判断语句中是可以接受的。
当使用数组保存用户的输入时,如何做到恰好够用,又不一点浪费?
在绝大多数C/C++编译器里面,要求数组的长度为常量。因此,可用动态内存分配法malloc/free,例如 :
void *p=malloc(1024);//从内存中申请一块大小为1024直接的空间,将这个空间的首地址返回给p;
free(p);//释放内存。
------------------------------------------
内存分配方式有三种:
1、从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。
2、在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
3、从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由程序员决定,使用非常灵活,但如果在堆上分配了空间,就有责任回收它,否则运行的程序会出现内存泄漏,频繁地分配和释放不同大小的堆空间将会产生堆内碎块。
动态分配释放内存:
用malloc动态分配内存后一定要判断一下分配是否成功,判断指针的值是否为NULL。
内存分配成功后要对内存单元进行初始化。
内存分配成功且初始化后使用时别越界了。
内存使用完后要用free(p)释放,注意,释放后,p的值是不会变的,仍然是一个地址值,仍然指向那块内存区,只是这块内存区的值变成垃圾了。为了防止后面继续使用这块内存,应在free(p)后,立即p=NULL,这样后面如果要使用,判断p是否为NULL时就会判断出来。
在一下程序中,输出无效:
# include<stdio.h>
void main()
{
char *f();
char *s;
s = f();
printf ("%s", s);
}
char *f() //定义一个返回指针类型的函数
{
char s[4] = {'1','2','3','0'};
return s; //返回s数组的地址,但程序运行完s数组就被释放了
}
const 指针:可读不可写,封禁(限制)“*”操作里的写内存功能,即:只读,这块内存只能读不能写。
const用于限定函数的参数,当被const修饰,表示该参数仅用于输入。
int avg(const int *p, int len)
{
}
用于显示的指定:该函数是输入参数,在函数里只是读取这个内存,而不会修改这个内存的值。当你不需要修改内存时,在指针前面加const修饰,避免一不小心的错误发生。
const只是限制的是“*”操作,不允许写内存,但是普通指针的加减是没关系的。
但是,在如下语句中:
int * const p=&a中;p是不能被修改的。
指针不可乱用,一定要弄清楚指针指向哪里?指针指向的地址是否有效?当一个指针未赋值时,如:int *p;其值为随机值,指向一个随机的内存地址,称为“野指针(wild pointer)”。
值为0的指针,称为空指针。当指针为空时,不能用"*"操作,但是空指针在在if判断语句中是可以接受的。
当使用数组保存用户的输入时,如何做到恰好够用,又不一点浪费?
在绝大多数C/C++编译器里面,要求数组的长度为常量。因此,可用动态内存分配法malloc/free,例如 :
void *p=malloc(1024);//从内存中申请一块大小为1024直接的空间,将这个空间的首地址返回给p;
free(p);//释放内存。
------------------------------------------
内存分配方式有三种:
1、从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。
2、在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
3、从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由程序员决定,使用非常灵活,但如果在堆上分配了空间,就有责任回收它,否则运行的程序会出现内存泄漏,频繁地分配和释放不同大小的堆空间将会产生堆内碎块。
动态分配释放内存:
用malloc动态分配内存后一定要判断一下分配是否成功,判断指针的值是否为NULL。
内存分配成功后要对内存单元进行初始化。
内存分配成功且初始化后使用时别越界了。
内存使用完后要用free(p)释放,注意,释放后,p的值是不会变的,仍然是一个地址值,仍然指向那块内存区,只是这块内存区的值变成垃圾了。为了防止后面继续使用这块内存,应在free(p)后,立即p=NULL,这样后面如果要使用,判断p是否为NULL时就会判断出来。
在一下程序中,输出无效:
# include<stdio.h>
void main()
{
char *f();
char *s;
s = f();
printf ("%s", s);
}
char *f() //定义一个返回指针类型的函数
{
char s[4] = {'1','2','3','0'};
return s; //返回s数组的地址,但程序运行完s数组就被释放了
}
相关文章推荐
- JAVA-14.1-IO流之知识点补充
- 知识点总结(补充版)
- “注释”部分补充知识点:
- C语言指针小知识点记录
- C语言知识点
- iOS开发 —— Objective C语言知识点总结
- c语言知识点---qsort快速排序函数的使用
- C语言知识点汇总(未完成)
- Go语言知识点笔记
- 深入学习C语言知识点checklist——测试你掌握C的程度的答案
- 基础总结知识点-第五章JavaScript语言基础
- C语言知识点
- 优酷电视剧爬虫代码实现一:下载解析视频网站页面(3)补充知识点:XPath无效怎么办?
- Swift语言知识点小结类和对象
- php gettext方式实现UTF-8国际化多语言--(补充)
- 《The Python Tutorial》中知识点补充
- shell 知识点补充(4)-date/数值运算/test 指令/判断符号 [ ]/预设变数($0)/条件判断:if then
- [每天一个知识点]15-Java语言-字符串连接
- C#两个知识点的补充 string与stringbuilder的区别以及深层机制 C#中接口与抽象类的比较以及各自适用的场景
- C语言知识点