#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.