6

我认为如果指向 char 数组的 ac 指针递增,那么它将指向该数组中的下一个元素。但是当我尝试这个时,我发现我必须增加它两次。尝试使用 sizeof(char) 进行增量,我发现添加 char 的大小太多了,因此必须将其除以 2。

#include <stdio.h>

int main(int argc, char * argv[]){
   char *pi;
   int i;
   pi = argv[1];
   printf("%d args.\n",argc-1);
   printf("input: ");
   for(i=0;i<argc-1;i++){
      printf("%c, ",*pi);
      /*The line below increments pi by 1 char worth of bytes */
      //pi+=sizeof(pi)/2;
      /* An alternative to the above line is putting pi++ twice - why? */
      pi++;
      pi++;
   }
   printf("\n");
   return 0;
}

难道我做错了什么?还是我误解了递增指针的方法?

4

3 回答 3

20

sizeof(char) 保证为 1,但 sizeof(char*) 不是。

然而,您的功能只是偶然地起作用

例如,尝试使用以下参数调用它:

abc defg

这将产生:

2 args.
input: a, c,

这是完全错误的。问题是您正在递增指向 argv 的元素 1 的指针,而不是指向 argv 的指针。

尝试这个:

#include <stdio.h>

int main(int argc, char * argv[]){
   char **pi;
   int i;

   pi = argv + 1;
   printf("%d args.\n",argc-1);
   printf("input: ");
   for(i=0;i<argc-1;i++){
      printf("%c, ",**pi);
      pi++;
   }
   printf("\n");
   return 0;
}

这将打印每个参数的第一个字符:

2 args.
input: a, d,
于 2008-11-23T16:02:07.337 回答
4

如果您有一个ptr类型的指针T*并添加N,则该指针将前进一个N * sizeof (*ptr)或等效N * sizeof (T)字节。你只是忘了取消引用pi。所以你得到的sizeof (pi)是 的 sizeof char*,而不是 a 的 sizeof char。您的行相当于pi+=sizeof(char*)/2;您平台上的指针有 4 个字节大。因此实际上你做到了pi+=2;pi+=2如果要增加 2 倍,请写入。请注意,char根据定义,它的 sizeof 为 1。你不需要做sizeof (char),它总是1。

于 2008-11-23T15:59:36.403 回答
3

sizeof(pi) 返回 (char*) 的大小,它是 pi 的类型(一个指针,可能是两个、四个或八个字节)。sizeof(char) 将返回 1。

但是,要理解的另一件事是,每当您将指针递增一个数字时(例如: pi += sizeof(char); pi++; 等),无论如何您都会将指针递增基本大小。所以:

int *ipointer = &int_array[0];
ipointer += 2;

实际上会将 ipointer 增加 2倍 sizeof int

您似乎做错的另一件事是将 pi 指向第一个参数,然后遍历所有参数。如果您想遍历参数,请尝试以下操作:

for (i = 1; i < argc; i++) {
    pi = argv[i];
    // ... do something with pi
}
于 2008-11-23T16:02:23.170 回答