C语言知识点补充(1)

指针作为参数,要么是读内存,要么是写内存。
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数组就被释放了
}

猜你喜欢

转载自blog.csdn.net/qq_15897815/article/details/77367020