[英]What happens under the hood when you pass a string to a function in C
編譯器是否將其轉換為字符串文字?
這兩者之間有什么區別嗎?
printf("Hello world\n");
和
char* c = "Hello world\n";
printf(c); //I know you shouldn't do this
字符串只是一個char
數組(其中內容因 nul 字符的存在而終止)。
char s[] = "Hi"; // These two declarations
char s[] = { 'H', 'i', '\0' }; // are equivalent
數組不是 C 中的一等公民。它們不能傳遞給函數或從函數返回。
另一方面,指針是標量類型,可以像任何其他標量類型一樣傳遞給函數和從函數返回:按值。 也就是說,指針的值(它所持有的內存地址)被傳遞給函數或從函數返回。
所以當你輸入:
puts( "Hello world" );
發生的事情是將文字數組的第一個字符的地址傳遞給函數。
正如您懷疑的那樣,這與以下內容沒有什么不同:
const char * s = "Hello world"; // s is a pointer to read-only memory
puts( s );
同樣, s
是一個指針,其中包含文字數組中第一個字符的地址。 它的值(地址)被傳遞給函數。
如果s
是一個數組:
char s[] = "Hello world"; // s is an array, content copied from read-only memory
puts( s );
然后數組第一個元素的地址將被傳遞給函數。
您會發現 C 語言中任何類型的數組都存在同樣的情況:
int xs[] = { 2, 3, 5, 7, 11, 13 };
some_function( xs );
數組本身並沒有傳遞給函數,而是傳遞了指針&(xs[0])
的值,其中的值是數組第一個元素的地址。
在 C 語言中,我們稱之為“數組到指針的衰減”。
(數組是地址、元素類型和元素數量。指針只是地址和元素類型。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.