[英]How can a string literal be dereferenced?
以下代碼將字符 S 與字符串文字"Stack"
的第一個元素進行比較,
根據我的理解,只能取消引用指針,但是這個字符串文字像指針一樣工作嗎?
#include <stdio.h>
int main() {
if('S'==*"Stack")
printf("equal");
}
“String literal”是源代碼中一個事物的名稱,就像“keyword”是源代碼中int
或switch
等關鍵字的名稱。
當源代碼中出現字符串文字時,會創建一個字符數組,並用字符串文字的字符填充,加上終止字符 null (C 2018 6.4.5 6)。
當數組在表達式中使用時,除了作為sizeof
的操作數、一元&
的操作數,或作為用於初始化其他數組的字符串文字,它會自動轉換為指向其第一個元素的指針 (C 2018 6.3 .2.1 3).
因此,當"Stack"
出現在源代碼中時,它會導致指向“S”的指針,因此*"Stack"
是一個值為“S”的char
。
同樣, "Stack"[1]
是一個值為“t”的char
。
在 C 中,字符串文字是一個數組,因為 C 中的字符串是 arrays 個字符。
在 C 中,當一個數組出現在一個表達式中時,幾乎毫無例外地,您得到的(用於計算該表達式的數組“值”)是指向數組第一個元素的指針。
所以如果你說
int a[10];
*a = 7;
,這與a[0] = 7
所做的完全相同。 而且,完成后,您可以通過說if(*a == 7)
來測試它。
情況與您發布的示例 100% 相似。 字符串文字"Stack"
是一個數組,因此當您在表達式中使用它時,它的有效值是指向其第一個元素的指針。
展開內容以查看“隱藏”的內部步驟,它的工作方式與您編寫的情況相同
char stringliteral[] = "Stack"; /* the string literal is actually an array */
char *temporary_pointer;
temporary_pointer = &stringliteral[0]; /* we implicitly get a pointer to the array's first element */
if('S' == *temporary_pointer)
...
附錄:這個事實的另一個證明,即字符串文字實際上是一個數組,如果您正在編寫代碼將數字轉換為其字符串表示形式,就會出現。 任何整數到字符串的算法都不可避免地以計算必須轉換為相應字符的數字值告終。 如果您使用的基數為 10 或更少,則只需添加一個偏移量即可將數字轉換為字符: dig + '0'
。 但另一種方法也適用於例如十六進制數字,是"0123456789abcdef"[dig]
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.