обработка массива как одной переменной

#c #arrays #pointers #operators

#c #массивы #указатели #операторы

Вопрос:

код 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;
}
     .
     .
  

вывод кода: 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, как и не ожидалось! в строке 6 кода: 2 выполненная модификация изменялась ch1[2] = ch1[2]<<2; на *ch1 = *ch1<<2; . Я попытался обработать массив символов как одно числовое значение и выполнил << операцию; Я считаю, что мой метод неверен. существует ли какой-либо правильный метод обработки массива как единого числового значения для выполнения основных математических операций?

Обновление 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 бит.

Комментарии:

1. использовать *ch1 — это то же самое, что сказать ch1[0] .

2. Нет, вам придется перебирать каждый элемент.

3. В вашем втором методе вы должны использовать *(ch1 2) , чтобы привести его в соответствие с первым.

4. Вы пытаетесь сдвинуть биты через границы символов?

5. Вы не знаете, что << делает. Прочитайте об операторах c.

Ответ №1:

Важен ch1 тип указателя, аналогичный указателю на символ char* . когда вы это делаете *ch1 , вы ссылаетесь на символ, на который ch1 указывает. если вы хотите обработать весь массив как число, вам нужно преобразовать его в целое число, что также проблематично, потому что ваш массив имеет 3 байта, а целое число имеет 4, поэтому верхний байт x , на который указывает приведенный ниже пример, на самом деле не определен

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

Комментарии:

1. спасибо; 1 за ваш ответ, как только я достигну репутации 15.