为什么将字符串作为参数打印出来?在 c

why does the string get printed out as an argument? in c

为什么字符串 "test" 作为参数打印出来?

我没有传递指向字符串的指针,因为我没有在参数之前分配它

字符串参数“test”是否存储在内存堆中的某处?

void printAstring(char * string){
    printf("%s",string);
}

 printAstring("test"); //Prints out test

通常如果我想将字符串作为参数传递给 pointer as char parameter 我分配 char 数组然后传递它


void printAstring(char * string){
    printf("%s",string);
}

char printThis[5]="test";

 printAstring(printThis); //Prints out test

字符串常量实际上是一个 char 数组,存储在内存的 read-only 部分。因此,当您将它传递给 printAsString 时,您传递的是存储字符串常量的数组的第一个元素的地址。

当你在双引号之间写任何东西时几乎无一例外,像这样:

"string literal"

您正在创建(您正在要求编译器创建)一个 read-only、char 的匿名数组,大小恰到好处,初始化为包含该字符串。然后由于您在需要其值的表达式中使用此匿名数组(在本例中,因此您可以将其传递给 printAsString 函数),编译器会自动生成一个指向数组第一个元素的指针,就像您尝试使用它的值时对任何数组所做的那样。

换句话说,当你写

printAstring("test");

你得到的和你写的差不多

const char __anonymous_array[] = "test";
printAstring(&__anonymous_array[0]);

虽然字符串(匿名数组)没有存储在堆上;它通常与程序的初始化数据一起存储,或者可能(因为它是只读的)与其代码一起存储。