2014-09-28 56 views
-1

我无法弄清楚数组和指针的工作以及它们是如何相互关联的区别。下面的数组和指针示例的逻辑是什么?

代码:

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的位置吗?如果是这样,它背后的逻辑是什么?

+1

此代码无法编译,您在第一行中缺少'*'。 – 2014-09-28 08:50:36

+0

编辑该程序。 – Rishu 2014-09-28 08:51:50

+1

'str [6]'是'char',而不是'char *'。 'str'表示'str'的​​第一个元素的地址已经被评估为一个指针。 – BLUEPIXY 2014-09-28 08:52:05

回答

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 *的指针nd输出指针指向的所有字符,直到遇到终止零。

所以在这个代码剪断

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

您只需将指针右移6个字符,printf函数开始输出字符从str + 6

0

它正在推进由6 str基地址现在将指向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]表示字符串的第一个字符。

+0

但是为什么它会发生。请再次阅读上面的问题。 – Rishu 2014-09-28 08:54:37

+0

你应该分配该位置的地址。 – Rustam 2014-09-28 09:07:22

+0

ASCII可能不是目标字符集/编码。数组'str'是一个字节大小的代码单元序列。哪一个字符集的编码是未指定的。这就像是Windows-1252或equiv或Unicode/UTF-8。 – 2014-09-28 14:38:19

1

在您的代码中,str的类型为char[21]。也就是说,一个数组包含banti is a nice girl中的所有字符加上nul终结符,\0。现在,在C和C++中,数组很容易衰减到指向其第一个元素的指针。这发生在这个表达式:

str + 6 

这里,str可以被理解为&str[0]。将该值增加6,可得到指向strstr[6]的地址)中的第7个位置的指针,即iisptr被初始化为保存这个指针的值。当您将ptr传递到printf时,它将打印从该位置开始的字符串,直到nul终止符。

Now, I didn't use dereferencing operator in my printf statement, why it is giving me the context of the array, and not the address?

因为你告诉printf要传递一个指针到一个空终止字符串,让它可以打印出字符串。这就是"%s"的意思。 printf知道如何打印一个nul结尾的字符串。它打印字符,直到找到nul终止符\0

Why it gives error if I write char*ptr=str[6]; Error: cannot convert char to char*;

因为str[6]char,你不能从一个char初始化char*。这是编译器错误告诉你的。

+0

也许一个小的参考一些更多的解释:http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/BitOp/pointer.html – cageman 2014-09-28 08:58:23

+0

可以说int str [2,3,4,5,6 ,7,8]; int * ptr = str + 4;现在要打印值“6”,我会写入printf(“%d”,* ptr)而不是printf(“%d”,ptr)上面的问题。为什么这里的语法有所不同,为什么我的输出不是6 7 8,因为它发生在我上面的问题中? – Rishu 2014-09-28 09:05:09

+0

@Rishab不同的是'printf'假定你使用'%s'并传递'char *'时传递一个nul结尾的字符串。它打印字符,直到找到一个nul终止符。 – juanchopanza 2014-09-28 09:11:14

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。这i您试图在字符指针STR存储..

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意味着指针str6元素移动到它指向的元素之后。

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+6char*,但*(str+6)char,等于'i';
char不能隐式转换为char*

什么是printf,当你给它的格式为字符串%s

它期望你给它char*指针指向char);
它使的char*你给(让我们命名副本copy),并执行类似副本:

while((*copy)!='\0'){ 
    //print out *copy; 
    ++copy; 
} 

所以,它打印char从后阵char,直至符合'\0'