1,未初始化和非法的指針
int * a;
* a = 12;
a 未被初始化,不知道指向哪裏有,可能指向一個合法地址,把12存儲到a所指的內存位置,可能就篡改一個合法的值。
2,NULL指針
它是一個特殊的指針,表示不指向任何東西。
使一個指針變量爲NULL,可以賦一個零值。
但是需要注意的是,對一個NULL指針解引用是非法的,所以在對指針解引用之前要確定它非一個NULL指針。
3,左值和右值的區別
a = b+25;
a 是一個左值,它可以標示一個可以存儲結果值的地點,
b+25是個右值,它指定了一個值。
b+25 = a;
b+25 不能作爲左值,無法預測該結果會存儲在什麼地方,未標示一個特定的位置。字面值常量不能作爲左值
4,破壞指針數組的討論
在看到c與指針關於在一組字符串中查找一個字符的兩個版本的討論,實驗室幾個人嘰嘰喳喳爭論了半天,晚上查閱了一些資料,整理了一下,給大家做個參考。
//版本一
#include <stdio.h>
#define TRUE 1;
#define FALSE 0;
int find_char( char **strings,char value)
{
char * string;
while((string = *strings++) != NULL)
{
while(*string != '\0')
{
if(*string++ == value)
return TRUE;
}
}
return FALSE;
}
//版本二
#include <stdio.h>
#include <assert.h>
#define TRUE 1;
#define FALSE 0;
int find_char( char **strings,char value)
{
assert(strings != NULL);
while( *strings != NULL)
{
while(**strings != '\0')
{
if( *(*strings)++ == value)
return TRUE;
}
}
}
char ** 是指向指針的指針,這這裏看做是指針數組,數組中的元素是指向char的指針,而且都是指向各個字符串的首地址。
版本一中,通過中間指針string++來訪問每個字符串的元素,只是將每個字符串的指針做一份拷貝,而strings中每個指針依然指向每個字符串的首地址,可以查找多次。
版本二中,(*strings)++改變了strings數組的指針的地址,不再指向每個字符串的首地址,相當於破壞了指針數組,只能查找一次。