Хотя в ответах уже показано, как это сделать правильно (и намекает на неопределенное поведение), вас все равно могут интересовать детали ...
Вначале вам придется использовать массивы символов.Применение оператора addressof к не даст вам указатель на указатель, но указатель на массив:
int(*ptr1)[10] = &num1;
Синтаксис может выглядеть странно, но это C. Важная вещь здесь сейчас: у вас есть указательс одним уровнем косвенности.Но вы приводите его к указателю с двумя уровнями косвенности (char**
).
Что теперь происходит в fastSwap
:
char* t = *d;
Это скопирует столько байтов *d
в t
, так как указатели в вашей системе имеют размер.Исключительно: в действительности у вас есть не указатель на указатель, а указатель на массив, который только был приведен.Таким образом, первые sizeof(void*)
байтов массива будут скопированы в t.Аналогично для других заданий, объясняя полученные результаты.
Если бы теперь ваши массивы были короче, чем размер указателей, то память после массивов была бы прочитана:
int a[] = "123";
int b[] = "456";
int c[] = "789";
fastSwap ((char**)&a, char**(&b));
printf("%s %s %s", a, b, c);
напечатали на вашей системе (так как размер указателя составляет 8 байт):
456 789 456
Объяснение:
char *t = *d;
// copied the four bytes of b into t - AND the next four bytes (those of c!!!)
*d = *i;
// copied the eight bytes of a AND b int b AND c
// b contains "123", c "456"
*i = t;
// copied the eight bytes that were copied from b and c into a and b
// the "123" in b now got overwritten, that's why you never see them...
Имейте в виду, что у вас нет гарантии натакой результат, это просто наиболее вероятный.Вы вызвали неопределенное поведение, вместо этого может произойти что угодно , вы даже можете случайно отключить солнце (если ваш компилятор выдал соответствующий код ...).