我无法弄清楚数组和指针工作之间的区别以及它们之间是如何相互关联的。
代码:
char str[]="banti is a nice girl";
char *ptr=str+6;
printf("%s",ptr)
输出:is a nice girl
我没有在我的printf
声明中使用解除引用运算符,
为什么它会给我数组的内容,而不是地址?
当我写char*ptr=str[6]
时,我得到Error: cannot convert char to char*
-
这个错误意味着什么?
是否要引用我们需要放置&str[6]
的数组地址,但我们不需要在str+6
中进行放置?如果是这样,背后的逻辑是什么?
答案 0 :(得分:1)
在您的代码中,str
的类型为char[21]
。也就是说,一个数组包含banti is a nice girl
中的所有字符加上nul-terminator,\0
。现在,在C和C ++中,数组很容易衰减到指向第一个元素的指针。这发生在这个表达式中:
str + 6
此处,str
可以理解为&str[0]
。将其递增6会为您指向str
中的第7个位置(str[6]
的地址),即i
中的is
。初始化ptr
以保存此指针的值。当您将ptr
传递给printf
时,它会打印从该位置开始的字符串,直到nul终结符。
现在,我没有在我的printf语句中使用dereferencing运算符,为什么它给了我数组的上下文,而不是地址?
因为您告诉printf
您正在向它传递指向以空字符结尾的字符串的指针,以便它可以打印出字符串。这就是"%s"
的含义。 printf
知道如何打印以空字符结尾的字符串。它会打印字符,直到找到nul终结符\0
。
如果我写char * ptr = str [6],为什么会出错?错误:无法将char转换为char *;
由于str[6]
是char
,您无法从char*
初始化char
。这就是编译器错误告诉你的。
答案 1 :(得分:1)
使用下面的代码时
char str[]="banti is a nice girl";
printf("%s",str);
然后将数组str转换为指向其第一个char *
所以上面的代码相当于
char str[]="banti is a nice girl";
char *ptr=str;
printf("%s",ptr);
当函数printf进程格式说明符%s
时,它将相应的参数视为类型char *
的指针,并输出指针指向的所有字符,直到它遇到终止零。
所以在这段代码中剪掉了
char str[]="banti is a nice girl";
char *ptr=str + 6;
printf("%s",ptr);
您只需将指针向右移动6个字符,函数printf就会开始输出str + 6
答案 2 :(得分:0)
它将str
基地址提前6,现在点is a nice girl
试试这个:
main()
{
char str[]="banti is a nice girl";
char *ptr=&str[6];
printf("%s",ptr);
}
尝试打印它:
printf("%d",str[6]); // return first character ascii value
printf("\n%d",(str+6)); // return the address
printf("\n%d",&str[6]); // return the address
&str[6]
和(str+6)
都表示地址,但str[6]
表示字符串的第一个字符。
答案 3 :(得分:0)
您在
中收到的错误Why it gives error if I write char*ptr=str[6]; Error: cannot convert char to char*;
因为你正在做这样的事情
char* str = *(str + 6);
如你所知,str [6]将被评估为*(str + 6),等于i
。您要在char指针str ..
i
答案 4 :(得分:0)
我几乎可以肯定你根本不理解C和C ++中的数组和指针。
char str[]="banti is a nice girl";
此行创建一个字符数组。
['b','a','n','t','i',' ','i','s',' ','a',' ','n','i','c','e',' ','g','i','r','l','\0']
^
str
数组是[]
之间的数据,它存储在内存中的某个位置;
您可以通过指针str
访问它。
str+6
表示指针str
在其指向的元素之后移动6
个元素。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
{'b','a','n','t','i',' ','i','s',' ','a',' ','n','i','c','e',' ','g','i','r','l','\0'}
^ ^
str str+6
str[6]
表示*(str+6)
,表示获取str+6
的值。
str
为char*
,str+6
也为char*
,但*(str+6)
为char
,等于'i'
;
char
无法隐式转换为char*
。
printf
,当您在格式字符串中提供%s
时会是什么?它希望您提供char*
(指向char
的指针);
它会复制您提供的char*
(让我们将副本命名为copy
),并执行以下操作:
while( (*copy)!='\0'){
//print out *copy;
++copy;
}
因此,它会在数组char
之后打印char
,直到遇到'\0'
。