这是我写的程序:
main()
{
struct book
{
char name[25] ;
char author[25] ;
int callno ;
} ;
struct book b1 = { "Let us C", "YPK", 101 };
display(b1.name, b1.author, b1.callno);
}
void display(char *s, char *t, int n)
{
printf ("\n%s %s %d", s, t, n);
}
Run Code Online (Sandbox Code Playgroud)
输出是
让我们C YPK 101
按要求
现在,我们传递给函数什么display()是琴弦的基址name,并author在该函数的定义,使用指针.那么为什么函数喜欢printf("\n%s %s %d", s, t, n) 而不喜欢printf("\n%s %s %d", *s, *t, n)?
第二个没有运行.是不是s基地址和*s存储在该地址的字符串?
在C中,字符串只是内存块,恰好在它们的末尾有一个空终止符.惯例是通过char*指向字符串开头地址的指针来引用字符串.因此,库printf函数的设计使得说明%s符期望您提供指向最终应打印出的字符串开头的指针.
如果取消引用char*指针,则返回char表示该字符串的初始元素的单个指针.请注意,这不是字符串本身 - 它只是第一个字符.如果你试图传递*s到预期printf的%s说明符,你可能会崩溃程序,因为printf然后会跳转到一个内存地址,其数值由数字值给出,char并尝试开始打印它在那里找到的字符.