这个程序基本上做什么?减去指针?

时间:2012-07-17 14:01:38

标签: c string

int main(int argc, char* argv[])
{
   int i,s;
   s=0;
   char*p;
   for(i=1; i<argc;i++)
   {
      for (p=argv[i];*p;p++);
      s+=(p-argv[i]);
   }
 printf("%d\n",s);
 return 0;
}

我很难理解这段代码的作用。

据我所知,它忽略了程序的名称,并且对于在命令行中打印的每个其他字符串,它将p设置为当前字符串。

  1. 条件*p说“只要它不是p就行NULL,即直到你到达字符串的末尾?
  2. 在每次迭代中,s将当前p(字的其余部分)的减法与argv[i]的名称相加,此减法的结果是什么?这是两个ascii值的减法吗?
  3. 这个程序基本上做什么?

4 个答案:

答案 0 :(得分:2)

回答这个问题的关键是理解这个表达的含义:

p-argv[i]

这是一个指针减法表达式,它被定义为第一个和第二个指针之间指针所指向的元素大小的距离。当两个指针都指向一个已分配为连续块的内存区域时(这对于所有C字符串一般都是正确的,特别是argv[]的元素),这是有效的。

指针p首先进入字符串的末尾(注意循环末尾的分号;,这意味着循环体是空的),然后{{1减去。结果是相应参数的长度。

答案 1 :(得分:1)

此代码计算程序

的参数长度(作为字符串)的总和

答案 2 :(得分:1)

它告诉您传递给程序的所有参数的总字符串长度。

在你的观点(2)中,它只是用包含\0字符的地址减去字符串的起始地址

答案 3 :(得分:0)

它以向后类型的方式使用指针地址来计算所有参数中的总字符数。

for (p=argv[i];*p;p++); //sets p to the address of argv[i]'s \0 terminator
   s+=(p-argv[i]);     // p minus the address of the start of argv[i] accumulated to s