繁体   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