簡體   English   中英

如何將只讀字符串文字用作指針?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM