[英]how can a read-only string literal be used as a pointer?
在 C 中可以做到這一點
printf("%c", *("hello there"+7));
打印h
如何像指針一樣使用像“hello there”這樣的只讀字符串文字? 這究竟是如何工作的?
當您知道它是如何存儲的時,您就會明白。
字符串常量存儲在 .rodata 節中,與存儲在 .text 節中的代碼分開。 所以程序運行時,使用時需要知道這些字符串常量的地址,而且,字符串的長度和arrays不一樣,沒有簡單的方法來獲取(整數和浮點數都可以存入並通過寄存器傳遞),因此“字符串被訪問認為指針與數組相同”。
實際上,指令中無法硬編碼的值都存儲在.data和.rodata等部分中。
字符串文字是一個字符數組( char[]
),因此隱式轉換為指向數組第一個元素的 char 指針( char *
)。
因此,在問題( "hello there"+7
)的示例中,將7
添加到指向第一個字符( h
)的指針中,給出指向第 7 個字符(從零開始計數)的指針,該指針也恰好是h
( “那里”中的“h”)。
請注意,指針指向char
,而不是const char
。 但是,重要的是要知道在字符串文字指向的位置寫入是未定義的行為,這意味着在這種情況下每個編譯器實現都可以自由定義自己的行為。 根據編譯器的實現,它可能是不可能的(字符串文字可能存儲在只讀內存中),它可能有不可預見的副作用,它可能會更改字符串字符串文字而沒有任何副作用或......基本上任何東西.
允許兩個相同或重疊的字符串文字(例如“hello there”和“there”)共享相同的 memory 位置。 因此,以下表達式可能為真或假,具體取決於編譯器實現:
"hello" == "hello"
"hello there" + 6 == "there"
使用“匿名”字符串文字會很有趣。
用適當的序數后綴來表示日期是很常見的。 (例如“5 月 1 日”或“12 月 25 日”。)
以下“折疊”“月份”值 (1-31) 到值 0-3,然后使用該值對“分段”字符串文字進行索引。 這有效
// Folding DoM 'down' to use a compact array of suffixes.
i = DoM;
if( i > 20 ) i %= 10; // Change 21-99 to 0-9.
if( i > 3 ) i = 0; // Every other one ends with "th"
// 0 1 2 3
suffix = &"th\0st\0nd\0rd"[ i * 3 ]; // Acknowledge 3byte regions.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.