我很困惑

时间:2014-07-08 22:48:21

标签: c string

我正在研究指针。因此,同时研究阵列。它表示数组arr的第一个元素的地址是&arr[0],也可以写为arr

但是我知道字符串是一个字符数组,所以如果有一个字符串:

char string[] = "ilovejapan";

然后使用printf打印它

printf("%s", string);

不应该只打印第一个地址吗?真的很困惑现在。

问题已更新:现在在下面的示例中*W指向单词,表示它指向字符串word的第一个地址对吗?如何访问完整字符串word

int getword(char *word,  int lim) 
{ 
int c, getch(void); 
void ungetch(int); 
char *W  = word; 
while (isspace(c = getch()))
; 
if (c  !=  EOF) 
*W++  = c; 
if (lisalpha(c)) { 
*W  = '\0'; 
return c; 
} 
for (  ;  --lim > 0; W++) 
if ( lisalnum(*W = getch())) { 
  ungetch ( *W) ; 
  break; 
} 
*W  = '\0'; 
return word[O]; 
}

3 个答案:

答案 0 :(得分:7)

转化说明符%s说,"给我一个字符的地址。我将打印该字符,然后查看下一个更高的地址并打印那个字符,依此类推,直到我看到的地址中的字符为零"。所以string确实是一个角色的地址,但printf知道如何处理它。

答案 1 :(得分:2)

char string[0] = "ilovejapan";不是有效的声明。也许你打算离开0

无论如何,%s格式说明符旨在与指向字符串的指针匹配,在您的情况下就可以了。它会打印该地址中的字符,直到终止空字符。

答案 2 :(得分:1)

当您在string中传递printf("%s", string);时,您告诉printf您要打印一个字符串,并告诉该函数字符串中第一个字符的地址。使用其地址,printf可以确定在该地址存储的字符,并增加第一个字符的地址以获取第二个字符的地址,并打印该字符,依此类推。当它找到一个字符(不是该字符的地址,但实际字符本身)时,它会停止打印,其值为'\0'(“零”字符,或由数字0表示的字符)。如果这是有道理的。