1. 3种常见错误
- 用scanf()输入时忘记&;
int i;
scanf("%d", i);
/*i的值被当作地址。如i==100,那么输入的整数就会从地址100开始写入内存*/
- 数据类型和输入格式不匹配;
char c;
scanf("%d", &c);
/*输入以int的二进制形式写到c所在的内存空间。
c所占内存不足以放下一个int,其后的空间也被覆盖*/
- 函数中定义使用指针,指针未初始化;
void Swap(int *x, int *y)
{
int *pTemp;
*pTemp = *x;
*x = *y;
*y = *pTemp;
}
/*指针pTemp未初始化指针,pTemp指向哪里未知,对未知单元写操作是危险的*/
void Swap(int *x, int *y)
{
int *pTemp;
pTemp = x;
x = y;
y = pTemp;
}
/*非危险操作,但是交换的是地址值,不是指针指向单元的内容*/
建议改写为:
void Swap(int *x, int *y)
{
int temp;
temp = *x;
*x = *y;
*y = temp;
}
返回指针值的函数
编写指针函数使要注意返回值。
总体原则是:返回的指针对应的内存空间不会因函数返回则被释放掉。
常用的返回指针有以下几种:
- 函数中动态分配内存空间(通过malloc等实现)的首地址;
- 静态变量(static)或全局变量所对应的变量的首地址;
- 通过指针形参所获得的实参的有效地址。
空指针(NULL)
- 指针不能与非指针类型变量进行比较
- 但可与NULL(即0值)进行等或不等的关系运算
- 判断p是否为空指针
- NULL表示空指针,即无效指针
- 但它只是逻辑上无效,并不是真正地无效
- 0可以赋值给指向任意数据类型的指针变量
- 0是可以直接赋值给指针变量的唯一整数值
- 指针在初始化时一般为
int *p = NULL;
注意:NULL必须全部是大写
0 地址
- 内存中有0地址,但是0地址通常是个不能随便碰的地址;
- 指针不应该具有0值, 因此可以用0地址来表⽰特殊的事情;
- 返回的指针是无效的;
- 指针没有被真正初始化(先初始化为0);
- NULL是⼀个预定定义的符号,表示0地址;
- 有的编译器不愿意你用0来表示0地址。