C argv [2] ++ vs(char *)argv [2] ++?

时间:2015-09-23 19:50:47

标签: c char argv

为什么argvs行为奇怪? 例如:

这将按预期工作,打印第一个参数的第一个字符。

printf("%c", *argv[1]);

然而,这将打印ascii表中的字符(又名“一个更大的”表示为数字)而不是打印第一个参数的第二个字符:

printf("%c", *(argv[1] + 1);

轻微修改无效,完全相同的结果:

printf("%c", *(argv[1] + sizeof(char));

唯一有用的是实际将argv [2]强制转换为char *:

printf("%c", *( (char*)(argv[1] +1 ) );

为什么会这样?我知道:

argv's type :=  char** argv
and argv[1] == *(argv + 1)
and argv[1]'s type should be char*

但显然它不是,因为我需要施展它?这怎么可能?它被声明为char **,但其成员不是char * s?

2 个答案:

答案 0 :(得分:3)

你的问题的前提是错误的。这个计划:

#include <stdio.h>

int main (int argc, char *argv[]) {
  printf("%c\n", *(argv[1] + 1));
  return 0;
}

使用参数test运行,打印e,而不是u

答案 1 :(得分:0)

确保您的括号和取消引用确实在您认为的位置。如果argv[1]包含test,那么

* ( argv[1] + 1 ) == 'e'
( * argv[1] + 1 ) == 'u'
^ ^
| |
+-+- slight difference here