查看下面的代码
char *p="bayant"; // char pointer
char str[ ] = "bayant"; // char array
printf("%s",p);//here we are passing pointer
printf("%s",str);//here we are passing strings base address
但它是如何工作的,因为我们对指针和字符串使用相同的格式?
答案 0 :(得分:2)
%s
转换规范需要char *
参数。
在第二种情况下,您有一个char
参数数组,但C规则将char
数组类型的表达式转换为char *
类型<。 / p>
答案 1 :(得分:1)
C中的数组隐式是指向该类型的指针。所以str本质上也是指向char的指针。
当你做c =“string”时,C在内存中创建字符串,c是指向其中第一个字符的指针。
当你执行char str [] =“string”时,C在内存中创建相同的字符串,str是指向其中第一个字符的指针。
答案 2 :(得分:1)
对于printf
来说,重要的是, p 和 str 与printf属于同一类型。
两者都只是一个指向字符数组的指针。因此,printf会查看他们指向的位置并使用字符,直到下一个\0
。
答案 3 :(得分:1)
在这两种情况下p
&amp; str
是包含字符串的地址,格式说明符%s
用于打印它。
以下是您假设的典型内存布局,
+------+
p--->|bayant|
+------+
和
+------+
str|bayant|
+------+
答案 4 :(得分:0)
第一个是指针,第二个是数组。因此任何函数都可以区分这两个重载:
void foo(char* p){}
void foo(char str[]){}
如果您打算问这个问题。否则arrayname和指针在c
中真的相同