『Cとポインタ』のノートを勉強する

2540 ワード

Cとポインタという本を読むとき、第6章ではリストの文字列の中で特定の文字を検索する2つのバージョンについて見て、バージョン2で言及されたポインタの配列を破壊する原因を分析して、先にプログラムを書きました.
/*   */
#include 

#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 
#include 

#define TRUE    1
#define FALSE   0

int find_char( char **strings, int value )
{
    assert( strings != NULL );
    while ( *strings != NULL )
    {
        while ( **strings != '\0' )
        {
            if ( *(*strings)++ == value )
                return TRUE;
        }
        strings++
    }
    return FALSE;
}

char**はポインタを指すポインタであり、ここではポインタ配列と見なし、配列中の要素はcharを指すポインタであり、各文字列のヘッダアドレスを指す.本の中でバージョン2のプログラムがこのポインタの配列を破壊すると言っているのは、*(*strings)++という表現の中で、(*strings)は文字列のヘッダアドレスを指しているので、*(*strings)++を実行すると、++の優先度が*より高いため、(*strings)は先にその値を++し、(*strings)は文字列の2番目の要素を指すので、ポインタの配列を破壊します.