【问题标题】:treating an array as a single variable将数组视为单个变量
【发布时间】:2014-08-10 08:57:40
【问题描述】:

代码 1:

   .
   .
int main()
{
    char ch1[3];
    ch1[0]=ch1[1] = NULL;
    ch1[2]=0x01;
    ch1[2] = ch1[2]<<2;
    printf("%u", ch1[2]);
    system("PAUSE");
    return 0;
}
     .
     .

code:1 的输出是 4(如预期的那样)。

代码 2:

    .
    .
int main()
{
    char ch1[3];
    ch1[0]=ch1[1] = NULL;
    ch1[2]=0x01;
    *ch1 = *ch1<<2;
    printf("%u", ch1[2]);
    system("PAUSE");
    return 0;
}
      .
      .

但是 code:2 的输出却是 1 出乎意料!在代码:2 的第 6 行中,所做的修改将 ch1[2] = ch1[2]&lt;&lt;2; 更改为 *ch1 = *ch1&lt;&lt;2;。我尝试将 char 数组视为一个数值并完成了&lt;&lt; 操作;我相信我的方法是不正确的。是否有任何正确的方法可以将数组视为单个数值来进行基本的数学运算?

更新 1:

我已将代码更改为以下内容:

int main()
{
    char ch1[3];
    ch1[0]=ch1[1] = NULL;
    ch1[2]=0x01;
    *(ch1+2) = *(ch1+2)<<9;
    printf("%u", ch1[1]);
    system("PAUSE");
    return 0;
}

现在我得到输出:0。我不应该得到输出 2(即 2^(9-8))吗?仍然,如何将数组视为单个数值?

对;但我的实际问题是是否可以将数组视为单个值;也就是说,将 ch1[0]、ch1[1]、ch1[2] 视为 24 位的单个内存块。

【问题讨论】:

  • 使用*ch1ch1[0]是一样的。
  • 不,您必须遍历每个元素。
  • 在您的第二种方法中,您应该使用*(ch1 + 2) 使其与第一种方法一致。
  • 您是否尝试跨字符边界移位?
  • 你不知道&lt;&lt; 做了什么。阅读有关 c 运算符的信息。

标签: c arrays pointers operators


【解决方案1】:

指针的类型是important ch1 类似于指向char-char* 的指针。当您执行*ch1 时,您指的是ch1 指向的char。如果要将整个数组视为一个数字,则需要将其转换为整数,这也是有问题的,因为您的数组有 3 个字节,而整数有 4 个,所以下面示例中 x 的最高字节是指向,其实是undefined

int main()
{
    char ch1[3];
    ch1[0]=ch1[1] = 0;
    ch1[2]=0x01;
    int *x = (int*)ch1;
    *x <<= 2;
    printf("%u", ch1[2]);
    system("PAUSE");
    return 0;
}

【讨论】:

  • 谢谢;一旦我达到声望 15,+1 为您的回答。
猜你喜欢
  • 2011-12-18
  • 1970-01-01
  • 2014-02-14
  • 2018-07-31
  • 2019-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-08
相关资源
最近更新 更多