2015-10-07 42 views
2

我有一部分代碼,我不明白它是如何工作的。爲什麼有可能傳遞一個字符串作爲字符指針

int Save(int _key, char *file); 這種方法Save接受字符串作爲字符指針Save(i, "log.txt");

原來是Save方法我用fopen(file, "a+")裏面發生了什麼,在年底和它完美的罰款。

但是,我不明白它如何接受"log.txt"char *file

+0

您使用的是C編譯器嗎? – Azad

+0

@Azad我正在使用C++編譯器 – user3002135

+0

你能更清楚你不明白的東西嗎?你爲什麼認爲它不應該被接受?是關於字符串與指針的問題還是關於const指針與非const指針的問題? –

回答

5
"log.txt"

不是std:string實際上是含有{'l','o','g','.','t','x','t','\0'}字符數組,其類型是const char[N]其衰減到const char*因此調用Save(i, "log.txt");作品。

該調用有效,但編譯器會打印一條警告,指出從const char*char*的轉換已在C++ 03中被棄用,並且在C++ 11中無效。

+0

@juanchopanza你是正確的,編輯:-) –

+0

是不是他的問題,當函數期望'char *'時爲什麼'const char *'被接受? – Slava

+0

@Slava它可能是。我不知道。 –

8

的字符串文字"log.txt"具有類型char const[N],按照§2.13.5/ 8:

普通字符串和UTF-8字符串文字也稱爲窄字符串文字。窄字符串文字的類型爲「n常量字符數組」,其中n是下面定義的字符串的大小,並且具有靜態存儲持續時間(3.7)。

當作爲參數傳遞,其衰減到指針,按照§4.2/ 1:

左值或類型的右值「陣列NT的」或「未知的陣列結合的T 「可以被轉換爲」指向T的指針「類型的prvalue。結果是一個指向數組的第一個元素的指針。

原因char const*可以分配到char*is mostly there for backward compatibility reasons,它has been deprecated in C++11

+0

它是'char const [N]'還是'const char [N]'?不記得數組是否有區別(但我相信有指針) –

+1

@AlejandroDíaz沒有區別。當你在'*'之前或之後有'const'時,區別在於它分別指向值或指針的常量。 – Shoe

0

在C++中,用字符串文字初始化字符指針是完全正確的。 初始化後,我們可以像使用數組那樣使用該字符指針:

{ 
    char *s="abc"; 
    cout<<s[0]; 
    cout<<s[1]; 
} 
相關問題