簡體   English   中英

當您將字符串傳遞給 C 中的函數時,幕后會發生什么

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

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