【问题标题】:Pointer to one single char of a two dimensional array指向二维数组的单个字符的指针
【发布时间】:2013-08-07 00:24:48
【问题描述】:

据我所知,像这样的数组

int 示例[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

我做错了什么?提前谢谢!

【问题讨论】:

  • 您是否遗漏了命令参数中的某些内容?或者你应该给你的数字减 1。
  • 不,int example[10] 声明一个数组对象,而不是,我重复 not,一个指针对象。数组不是指针。阅读comp.lang.c FAQ 的第 6 节,尤其是问题 6.3。

标签: c arrays pointers argv


【解决方案1】:

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

这里还发生了一些其他奇怪的事情。 ptrarg2 被声明为双精度,而不是字符;这里的行为是将字符转换为其等效的浮点数字并存储它。也许您的意思是 ptrarg2 是一个字符?

接下来,printf() 与其附加参数不太对应。 &ptrarg2double *,但您将其分配给 %c(字符)字段,而不是 %p(指针)字段。 ptrarg2double,但您将其分配给 %d(十进制数)字段,而不是 %lf(长浮点数,又名双精度)字段。即使您的类型不匹配,printf 也会很乐意尝试打印出值,但它们会出错,并且很有可能崩溃。

【讨论】:

  • 改变 double ptrarg2=argv[1][1] 返回一个随机字符和位置 0 :S
  • 查看我的其他 cmets。你的 printf 和 ptrarg2 的类型也有问题。
  • 非常感谢您的帮助!
【解决方案2】:

&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;
}

【讨论】:

  • 非常好,谢谢!!你能解释一下负地址是什么意思吗?我希望它是这样的,例如:t@111 和 e@112 s@113 但它是:t@-1080558759 和 e@-1080558758
  • 原因是您将内存地址解释为带有"%d" 的有符号数字。内存地址应使用"%p"
  • 我爱你!非常非常非常感谢!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-26
  • 2017-06-11
  • 1970-01-01
相关资源
最近更新 更多