for循环计数器中的数组下标运算符

时间:2010-11-13 00:02:24

标签: c arrays pointers for-loop

我正在学习C.在下面的代码中,为什么在for循环截断中用“ptr_str [i]”替换“* ptr_str”?

/* 13L01.c: Initializing strings */
#include <stdio.h>
main()
{
 char str1[] = {'A', ' ',
 's', 't', 'r', 'i', 'n', 'g', ' ',
 'c', 'o', 'n', 's', 't', 'a', 'n', 't', '\0'};
  char str2[] = "Another string constant";
  char *ptr_str;
  int i;

  /* print out str2 */
  for (i=0; str1[i]; i++)
      printf("%c", str1[i]);
      printf("\n");
  /* print out str2 */
  for (i=0; str2[i]; i++)
      printf("%c", str2[i]);
      printf("\n");
   /* assign a string to a pointer */
   ptr_str = "Assign a strings to a pointer.";
   for (i=0; *ptr_str; i++)
       printf("%c", *ptr_str++);
   return 0;

}

3 个答案:

答案 0 :(得分:2)

因为你推进ptr_str然后将其作为一个数组处理并测试它是否指向第i个成员上的NULL。您基本上是在测试ptr_str[i+i]NULL而不是ptr_str[i]

答案 1 :(得分:2)

   // A, ok
   while (*ptr_str)
       printf("%c", *ptr_str++);

   // B, also ok
   for (i=0; ptr_str[i]; i++)
       printf("%c", ptr_str[i]);

   // C, works but ugly
   for (i=0; *ptr_str; i++)
       printf("%c", *ptr_str++);

C是你的形式,它有缺陷,因为我在这里什么都不做,所以A是一个改进的版本。如果你想使用i,那么就像B一样。如果同时使用i和ptr_str,并在循环中增加它们,那么就不会有任何好处。增加一个或另一个。

答案 2 :(得分:1)

你的问题有点不清楚,但我想我已经明白了:

  

在下面的代码中,为什么在for循环截断中用“ptr_str [i]”替换“* ptr_str”?

我认为你的意思是改变这个:

for (i=0; *ptr_str; i++)
    printf("%c", *ptr_str++);
return 0;

到此:

for (i=0; ptr_str[i]; i++)
    printf("%c", *ptr_str++);
return 0;

第二个截断是因为您推进i ptr_str,因此修改后的起始位置为ptr_str 加上修改后的i起始位置最终会过早地切断你(或者更糟糕的是,有一个奇数个字符并且溢出到不属于你的数据中)。截断的第二个例子相当于:

for (i=0; ptr_str[i * 2]; i++)
    printf("%c", ptr_str[i]);
return 0;

现在你明白为什么会截断吗?