Я новичок в программировании и изучаю указатели в массиве. Я немного смущен прямо сейчас. Взгляните на программу ниже:
#include <stdio.h>
int fun();
int main()
{
int num[3][3]={23,32,478,55,0,56,25,13, 80};
printf("%d\n",*(*(num+0)+1));
fun(num);
printf("%d\n", *(*(num+0)+1));
*(*(num+0)+0)=23;
printf("%d\n",*(*(num+0)));
return 0;
}
int fun(*p) // Compilation error
{
*(p+0)=0;
return 0;
}
Это была программа, записанная в заметках моего учителя. Здесь, в функции main()
, в функции printf()
оператор разыменования используется два раза, потому что num
является указателем на массив, поэтому первый раз оператор разыменования даст указатель на int
, а затем второй даст значение, на которое указывает указатель.
Мой вопрос в том, что когда я передаю имя массива в качестве аргумента функции fun()
, то почему используется *p
; почему бы не **p
, поскольку num
является указателем на массив?
Во-вторых, почему *(p+0)
используется для изменения значения нулевого элемента массива; почему не *(*(p+0)+0)=0
как в main()
функция *(*(num+0)+0)
используется для изменения значения нулевого элемента?
Все это очень запутанно для меня, но я все равно должен это понять. Я искал об этом и обнаружил, что существует разница между указателем на массив и указателем на указатель, но я мало что понял.
int fun(*p) { ... }
не должен компилироваться. Какой компилятор (с какими флагами) вы используете? - person mafso   schedule 03.12.2014-std=[gnu|c][89|99]
). - person mafso   schedule 04.12.2014(*p)[3]
есть*(*p + 3)
, и это все, что я могу сказать без объявленияp
. - person mafso   schedule 04.12.2014