增加C指针

时间:2008-11-23 15:53:27

标签: c pointers

我认为如果指向char数组的c指针递增,那么它将指向该数组中的下一个元素。但是当我尝试这个时,我发现我必须增加两次。使用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;
}

我做错了吗?或者我误解了增加指针的方法?

3 个答案:

答案 0 :(得分: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,

答案 1 :(得分:4)

如果您的指针ptr类型为T*并且添加了N,那么指针将提前N * sizeof (*ptr)或等效N * sizeof (T)字节。你只是忘了取消引用pi。因此,您使用sizeof (pi)获得的是char*的sizeof,而不是char的sizeof。你的行相当于pi+=sizeof(char*)/2;你平台上的指针大4个字节。因此实际上你做了pi+=2;。如果要增加2次,请写pi+=2。请注意,根据定义,char的sizeof为1。您不需要执行sizeof (char),它始终为1.

答案 2 :(得分: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
}