关于指针:安全
当定义int *p时,它也会在内存中给指针变量p分配一个内存单元,假设这个单元在内存的编址为0x1003;此时,0x1003中的值是不肯定的,(由于咱们没有给指针赋值),当编译器遇到了p=&a时,就会在0x1003单元中保存一个地址(变量a在内存中分配的地址)函数
空指针:不指向任何单元,仿真野指针。在stdio.h中被定义为spa
#define NULL ((void *)0)
#define NUL ’\0
NULL 使 p 指向地址 0。大多数系统中都将 0 做为不被使用的地址,因此吴用 p 也不会毁坏数据
但并不是老是如此,也有系统会使用地址 0,而将 NULL 定义为其余值,因此不要把 NULL 和 0 等同起来
由于PC上有NULL的定义因此能够直接拿来使用,可是在单片机中,就没有NULL了。并且也不能简单将NULL自定义为0,由于0地址处是有用的,那么此时该怎么办呢?
空指针在概念上不一样于未初始化的指针。空指针能够确保不指向任何对象或函数; 而未初始化指针则可能指向任何地方。在函数调用时对全部的空指针进行类型转换多是预防可变参数和无原型函数出问题的最安全的办法
注意 NULL 和 NUL 的区别:NULL表示空指针,是一个宏定义,能够在代码中直接使用。而 NUL 表示字符 '\0',也就是字符串结束标志,它是ASCII码表中的第 0 个字符。NUL 没有在C语言中定义,仅仅是对 '\0' 的称呼,不能在代码中直接使用
野指针的2种状况:指针
1 定义指针时没有肯定的指向对象(没赋值成NULL)code
2 指针p被free或者delete以后,没有置为NULL对象
code是KEIL C51的扩展关键字,被其修饰的变量放在ROM(硬件层面实现只读),经常使用来存储一个字库等常量数据表;内存
const是ANSI C的关键字(使用范围比keil广),被其修饰的变量理论上能够修改,但编译器会识别并报错。经常使用来修饰一个常量字符串或常量表。字符串
(void *)型通用指针(无确切类型):它能够指向任何类型的变量,连续存储区的存储单元。任何类型的指针均可以经过显示类型转换变为void*型指针(即做为左值。为了获取其存储的起始地址而不得到大小),即void*是一种特别的指针,表明任何存储类型(不能判断所指对象的存储长度,因此不能引用和参与计算(不能直接进行取内容的操做.必须先转成别的类型的指针才能够把内容解释出来);常作函数的参数和返回值:此时表示入口参数或返回值能够是任何类型的指针)。指针有两个属性:指向变量/对象的地址和长度
可是指针只存储地址,长度则取决于指针的类型 。
编译器根据指针的类型从指针指向的地址向后寻址。原型
void * memcpy(void *dest, const void *src, size_t len);
void * memset ( void * buffer, int c, size_t num );编译器
所以:
1 在51单片机中定义字库表要用到code(也能够用const CODE这样既说明存储类型有说明读写特性),查表返回表中位置要 unsigned char code *,不要code要出错由于一个是定位到IDATA中,一个在CODE中。
2 字符串或者字符型指针做为参数和返回值:做为参数时用const void*,返回值用void*
3 char *p= "hello word!",此时不能用P[2];
char str[]="hello word!",此时能够用P[2];
或者char str[]= "hello word!";char *p=str;此时能够用P[2];