指向二维数组的单个字符的指针

时间:2013-08-07 00:24:49

标签: c arrays pointers argv

据我所知,像

这样的数组
  

int example [10]

只是指向此数组中第一个元素的指针。

  

char * argv []

是一个指针数组;所以这应该是指向其他指针的指针。

我现在有以下问题:

int main(int argc, char* argv[])
{
  double ptrarg2=argv[2][1];
  printf("beginletter=%c\nbeginpos=%d\n",&ptrarg2, ptrarg2);
  return 0;
}

我正在使用./program test启动程序并期望输出为:

beginletter=c
beginpos=123213123 

虽然123213123应该是实际存储c的地址。

我实际上得到了:

beginletter=
beginpos=0
我做错了什么?提前谢谢!

2 个答案:

答案 0 :(得分:4)

看起来argv[0]将是"./program"argv[1]将是"test",而argv[2]将是未定义的或NULL你没有三个论点。 argc的值应该告诉您argv[]中有多少项。我在这种情况下的猜测是答案为2,因此只有前两个(argv[0]argv[1])有效。

这里还有其他一些奇怪的事情。 ptrarg2被声明为double,而不是char;这里的行为是将字符转换为浮点数字等价物并存储它。也许你的意思是ptrarg2成为一个角色?

接下来,printf()与其他参数不太一致。 &ptrarg2double *,但您将其分配给%c(字符)字段,而不是%p(指针)字段。 ptrarg2double,但您将其分配给%d(十进制数字)字段,而不是%lf(长浮点,又称双精度)字段。即使您的类型不匹配,printf也会愉快地尝试打印出值,但它们会出错,并且崩溃是非常可能的。

答案 1 :(得分:1)

&ptrarg2是局部变量的地址,它不是您期望的地址。只需使用argv[1][0]argv[1]即可。 argv[1][0]将为您提供第一个参数的第一个字符,argv[1]将为您提供指向第一个参数的指针。

#include <stdio.h>

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