Я думаю, что стоит добавить к другому ответы на быстрое объяснение указателей, массивов и мест памяти в c.
Во-первых массивов в C только блок памяти, достаточно большой, чтобы держать количество элементов в массиве (см http://www.cplusplus.com/doc/tutorial/arrays/)
так, если мы сказали
int[5] example;
example[0] = 1;
example[1] = 2;
example[2] = 3;
example[3] = 4;
example[4] = 5;
Предполагая ИНТ 32 бита мы будет иметь блок памяти 5 * 32 бит = 160 бит. Поскольку C - язык низкого уровня, он пытается быть настолько эффективным, насколько это возможно, поэтому сохраняет наименьшее количество информации о массивах, насколько это возможно, в этом случае наименьшее возможное количество - это адрес памяти первого элемента. Таким образом, тип примера может быть выражен как
int *example;
Или пример указывает на int. Чтобы получить элементы в массиве, вы затем добавляете правильный номер в адрес, хранящийся в примере, и читаете номер на этом адресе памяти. Если мы предположили вид памяти как
Memory Address = Value (ints take up 4 bytes of space)
1000 = 1 <-- example
1004 = 2
1008 = 3
1012 = 4
1016 = 5
Так
int i = example[3]; //The 4th element
может быть выражено как
int i = *(example + 3 * sizeof(int));
int i = *(example + 3 * 4);
int i = *(1000 + 12);
int i = *(1012); // Fetch the value at memory location 1012
int i = 4;
SizeOf (INT) является 4 (интермедиат 32 бита или 4 * 8 бит байтов). Если вы пытаетесь сделать добавление, вам нужен символ, который имеет 8 бит или 1 * 8 бит байтов.
Так назад к вам код
char* p; // declare p as a pointer to a char/
p = (char *)a; // point p at memory location 3000
// p[b] would be the 21st element of the "array" p =>
// p[20] =>
// p + 20 * sizeof(char) =>
// p + 20 * 1 =>
// p + 20 =>
// 3000 + 20 =>
// 3020
// the & operator in c gets the address of the variable so
sum = (int) &p[b];
// &p[b] => find the address pointed to by p[b] => 3020
// (int) casts this pointer to a int.
Так сумма присваивается адрес 21-го элемента массива.
Long winded информация.
Похоже побитовой операции. Вы можете быстро взглянуть на http://www.cprogramming.com/tutorial/bitwise_operators.html для получения дополнительной информации. –
Простите, но это совсем не поразрядно. Код изобрел, но вы поймете это, если немного почитаете в Арифметике указателей (особенно в операторе []). Если вы собираетесь программировать на C, это определенно будет стоить ваше время. –
См. Также: [Как добавить два номера без оператора +?] (Http://stackoverflow.com/questions/4679556/how-do-i-add-two-numbers-without-the-operator) – Mysticial