【 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的值,來執行這個程式:
大家可在這個網站上實驗:ofollow,noindex" target="_blank">https://www.tutorialspoint.com/compile_c_online.php
當輸入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; }