增加C指针

6 c pointers

我认为如果指向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;
}
Run Code Online (Sandbox Code Playgroud)

难道我做错了什么?或者我误解了增加指针的方法?

phi*_*hag 20

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

尽管如此,您的功能只能偶然发挥作用.

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

abc defg
Run Code Online (Sandbox Code Playgroud)

这将产生:

2 args.
input: a, c,
Run Code Online (Sandbox Code Playgroud)

这是完全错误的.问题是你正在增加一个指向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;
}
Run Code Online (Sandbox Code Playgroud)

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

2 args.
input: a, d,
Run Code Online (Sandbox Code Playgroud)


Joh*_*itb 4

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