指針基礎知識 ,破壞指針數組的討論,

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數組的指針的地址,不再指向每個字符串的首地址,相當於破壞了指針數組,只能查找一次。

發佈了47 篇原創文章 · 獲贊 6 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章