下面的数组和指针示例背后的逻辑是什么?

时间:2014-09-28 08:49:13

标签: c++ c arrays pointers printf

我无法弄清楚数组和指针工作之间的区别以及它们之间是如何相互关联的。

代码:

char str[]="banti is a nice girl";
    char *ptr=str+6;
    printf("%s",ptr)

输出:is a nice girl

  1. 我没有在我的printf声明中使用解除引用运算符,
    为什么它会给我数组的内容,而不是地址?

  2. 当我写char*ptr=str[6]时,我得到Error: cannot convert char to char* -
    这个错误意味着什么?

  3. 是否要引用我们需要放置&str[6]的数组地址,但我们不需要在str+6中进行放置?如果是这样,背后的逻辑是什么?

5 个答案:

答案 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 ++中的数组和指针。

数组如何在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的值

strchar*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'