1. 程式人生 > >【 C 】字串常量

【 C 】字串常量

當一個字串常量出現在表示式中時,它的值是個指標常量。編譯器把這些指定字元的一份拷貝儲存在記憶體的某個位置,並存儲一個指向第一個字元的指標。但是,當陣列名用於表示式中時,它們的值也是個指標常量。我們可以對它們進行下標引用、間接訪問以及指標運算。

這些操作對於字串常量是不是也有意義呢?

看看下面這個表示式是什麼意思?

"xyz" + 1

看上去像是一個垃圾!它好像是試圖在一個字串上面執行某種型別的加法運算。

但是,當你記得字串常量實際上是一個指標常量時,它的意義就變得清楚了。這個表示式計算“指標值 + 1”的值。它的結果是個指標,指向字串的第二個字元:y。

那麼這個表示式又是什麼呢?

*"xyz"

理解了第一個,後面的都好說:對一個指標執行間接訪問時,其結果就是該指標指向的值。字串常量的型別是指向字元的指標,所以這個間接訪問得到的結果是字元‘x’。

我們繼續放出大招:

"xyz"[2]

很簡單,對一個指標進行下標訪問是合理的,就像陣列名也是一個指標常量,對其下標訪問就是對陣列中的元素進行訪問,這個同理,表示式的值為一個字元‘z’。

下面給出一個錯誤的例子:

*( "xyz" + 4 )

這個表示式的結果是什麼呢?

事實上,這是一個錯誤,它的偏移量4超過了字串的訪問,就像你訪問一個數組的元素,超出了索引範圍一樣,這樣有可能會出大事!這個表示式的結果是一個不可預測的值。

什麼時候會用到類似這些形式的表示式呢?

《C與指標》給出了一個神祕函式的例子:

#include <stdio.h>


void mystery( int n )
{
    n += 5;
    n /= 10;
    printf("%s\n", "**********" + 10 - n );
}

最後一個標準輸出語句使用了字串常量,下面我們測試下這個函式執行的情況:

#include <stdio.h>
#define M 6

void mystery( int n )
{
    n += 5;
    n /= 10;
    printf("%s\n", "**********" + 10 - n );
}

int main()
{
    mystery( M );
    return 0;
}

我們通過改變M的值,來執行這個程式:

當輸入M = 10 時候:

輸入M = 100時:

各位自行總結規律!各位大俠如果覺得這個例子垃圾,那我們就再看一個例子:

這個例子在遞迴函式中也見過,非常好玩!

貼出來程式碼:

//接受一個整型值(無符號),把它轉換為字元並列印它。
 
#include <stdio.h>
 
void binary_to_ascii(unsigned int value)
{
	unsigned int quotient;
	
	quotient = value / 10;
	if(quotient != 0)
		binary_to_ascii(quotient);
	
	putchar(value % 10 + '0');
	
} 

這個例子,如果你不太瞭解遞迴函式,恐怕會感到無解!

但它確實能實現把一個整型值轉換為字元列印的操作。

測試下唄:

//接受一個整型值(無符號),把它轉換為字元並列印它。

#include <stdio.h>

void binary_to_ascii(unsigned int value)
{
	unsigned int quotient;

	quotient = value / 10;
	if(quotient != 0)
		binary_to_ascii(quotient);

	putchar(value % 10 + '0');

}

int main()
{
    binary_to_ascii(16);

    return 0;
}

下面我們對這個例子進行修改,以十六進位制的形式列印結果值:

//接受一個整型值(無符號),把它轉換為字元並列印它。

#include <stdio.h>

void binary_to_ascii(unsigned int value)
{
	unsigned int quotient;

	quotient = value / 16;
	if(quotient != 0)
		binary_to_ascii(quotient);


	putchar( "0123456789ABCDEF"[value % 16] );

}

int main()
{
    binary_to_ascii(26);

    return 0;
}

這就很完美了,成功的運用了字串常量是一個指標常量的意義來設計程式!

當然,如果覺得字串常量難以理解的話,可以有一個簡單的替代方案,但是程式碼沒有字串常量簡潔:

//接受一個整型值(無符號),把它轉換為字元並列印它。

#include <stdio.h>

void binary_to_ascii(unsigned int value)
{
	unsigned int quotient, remainder;

	quotient = value / 16;
	if(quotient != 0)
		binary_to_ascii(quotient);


	remainder = value % 16;
	if( remainder < 10 )
        putchar( remainder + '0' );
    else
        putchar( remainder - 10 + 'A' );

}

int main()
{
    binary_to_ascii(26);

    return 0;
}