int (*p)[2]
- указатель на тип int [2]
, который сам по сути является типом int *
, но с некоторой дополнительной проверкой типа на границах массива.
Таким образом, в p = &s[i];
вы устанавливаете p
как адрес указателя на область памяти, где находится массив s[i]
.
Гораздо проще просто сделать p
также массивом (т. Е. «По существу» указателем на область памяти с дополнительным оборудованием), а затем использовать его непосредственно для указания на область памяти массива (p = s[i]
). Однако в этом случае это именно то, что делает pint
(как истинный указатель), поэтому мы можем полностью удалить p
.
Итак:
#include <stdio.h>
int main(){
int s[4][1] = {{1234,1},{1233,2},{1232,3},{1331,4}};
int i,j,*pint;
for(i=0;i<4;++i){
pint = (int*)s[i];
printf("\n");
for(j=0;j<=1;++j)
printf("%d ",*(pint+j));
}
return 0;
}
См. Массивы и указатели или google для "Массивы и указатели C", а также Адрес указателя в многомерном массиве C .
Заметьте, я предполагаю, что вы просто делаете это, чтобы поиграть и понять, как взаимодействуют указатели и массивы, поэтому я не комментирую, идеально ли использовать арифметику указателей или понятие массива и т. Д. В каждом случае.
Заметьте также, что я говорю, что массив - это «по существу указатель [...]», однако это не совсем верно, во многих случаях он просто действует как указатель, и по большей части это разумный способ думать о том, как все работает. В действительности к массивам относятся особым образом. См. Является ли имя массива эквивалентным указателю? и Массивы .