Лично мне такая запись была яснее, мало ли кому непонятно было))) int arr_size = sizeof(playground); int row_size = arr_size / sizeof(*playground); int col_size = sizeof(*playground) / sizeof(**playground); Спасибо за уроки!
7:38 Через запятую индексы прописывать можно, но это будет означать совсем не обращение к элементу многомерного массива. И это частая ошибка начинающих, особенно тех, кто ранее программировал на Паскале или Бейсике. Если написать ar[i, j, k] , то ошибки (синтаксической) не будет, в Си это вполне допустимая запись. Но это не три индекса, это один индекс, задаваемый операцией "следование" (операция обозначается как ","). Т.е. для вычисления индекса компилятор возьмем i, потом возьмет j, потом возьмет k и значение всего выражения в квадратных скобках будет равно k. Поэтому ar[i, j, k] означает то же самое, что и ar[k]. А чтобы обратится именно к элементу массива нужно каждый индекс прописать в отдельных квадратных скобках ar[i][j][k]
не понимаю почему ты говоришь что char (*p)[3] это указатель на двумерный массив. Это же указатель на одномерный массив из 3ех элементов, где каждый элемент это чар
@@selfedu_rus Вроде разобрался. char *arr[3] оказался массивом из 3ех элементов, где каждый элемент это указатель на чар. Тут arr именно массив, то есть присвоить arr новый указатель нельзя, а char(*p)[3] - это указатель на массив из чаров и тут можно менять адрес указателя p. Что касается передачи в функцию массива в виде параметра у нас по сути есть 2 варианта. Либо мы передаем указатель на первый элемент, либо передаем указатель на весь массив в типе которого будет длина этого массива. void foo(int *arr) { // тут у нас есть просто указатель на инт }; void bar(int (*arr)[3]) { // тут мы даже сможем получить sizeof(*arr) благодаря длине в типе }; int main(void) { int arr[3] = {1,2,3}; foo(arr); bar(&arr); } Причем в случае когда мы передаем просто ссылку на первый элемент как в функции foo у нас нет никакой гарантии, что туда передается именно массив. Никто не запретит мне в main сделать так - int i = 5; foo(&i); Когда параметр имеет такую запись int (*p)[3], точно так же как и с foo нет никакой гарантии, что это будет двумерный массив, возможно кто-то передаст одномерный массив как в примере с bar. А указатель на двумерный масив насколько я понимаю будет выглядеть как то так - int (*arr)[3][3] int arr[3] - arr это массив из трех элементов, где каждый элемент это инт int *arr[3] - arr это массива из трех элементов, где каждый элемент это указатель на инт int (*arr)[3] - arr это указатель на массив из трех элементов, где каждый элемент это инт
@@Grandize Не совсем. Я выше всё расписал. указатель на двумерный массив это int (*arr)[3][3] а int (*arr)[3] это указатель на одномерный массив из 3ех интов и ради примера я передал в функцию bar одномерный массив, где аргумент имеет ровно такой же тип. Это все равно что сказать что int *num это обязательно указатель на массив из интов, а не просто указатель на инт
Сказать что я офигел нечего не сказать. Это было не просто круто, это было сами знаете как круто
Классная тема, после нее отваливается большинство народу пытающихся изучить язык c, особенно после того, что сказано в конце)
Шикарные уроки! Божественный дар преподавания!
Всем со Школы 21 привет 😀
Это ад )
@@tony_slark4757 здоровья погибшим
Здарова мужик😂
Привет-привет! июльский бассейн теперь просмотры накручивает...
Бассейн от 16 сентября, хеллоу
Да давай ура давай вперед!!!!!!
Это реально очень круто.
Спасибо. Все понятно.
Лично мне такая запись была яснее, мало ли кому непонятно было)))
int arr_size = sizeof(playground);
int row_size = arr_size / sizeof(*playground);
int col_size = sizeof(*playground) / sizeof(**playground);
Спасибо за уроки!
Спасибо Вам за уроки!
Круто,просто нереально.Читаете мои мысли,отвечая на вопросы.
Просто СУПЕР!!!!!!!!!👍🏻
Хороший урок
7:38 Через запятую индексы прописывать можно, но это будет означать совсем не обращение к элементу многомерного массива. И это частая ошибка начинающих, особенно тех, кто ранее программировал на Паскале или Бейсике. Если написать ar[i, j, k] , то ошибки (синтаксической) не будет, в Си это вполне допустимая запись. Но это не три индекса, это один индекс, задаваемый операцией "следование" (операция обозначается как ","). Т.е. для вычисления индекса компилятор возьмем i, потом возьмет j, потом возьмет k и значение всего выражения в квадратных скобках будет равно k. Поэтому ar[i, j, k] означает то же самое, что и ar[k]. А чтобы обратится именно к элементу массива нужно каждый индекс прописать в отдельных квадратных скобках ar[i][j][k]
да, век живи, век учись, спасибо!
спасибо
Было бы интересно узнать про работу со вложенными массивами, типа [ name, value, [ [ name, value,[ ] ], [ name, value, [...
Прошу поправить если не прав, при передаче массива в функции, его размер подсчитать с помощью sizeof не получиться.
да, т.к. передается не массив, а указатель на него (хотя, в C++ можно передать массив по ссылке и там размер известен)
не понимаю почему ты говоришь что char (*p)[3] это указатель на двумерный массив. Это же указатель на одномерный массив из 3ех элементов, где каждый элемент это чар
то, что вы говорите - это:
char *p[3];
а если нам, например, в функцию нужно передать двумерный массив, то параметр записывается, как указано в видео
@@selfedu_rus Вроде разобрался. char *arr[3] оказался массивом из 3ех элементов, где каждый элемент это указатель на чар. Тут arr именно массив, то есть присвоить arr новый указатель нельзя, а char(*p)[3] - это указатель на массив из чаров и тут можно менять адрес указателя p.
Что касается передачи в функцию массива в виде параметра у нас по сути есть 2 варианта. Либо мы передаем указатель на первый элемент, либо передаем указатель на весь массив в типе которого будет длина этого массива.
void foo(int *arr) {
// тут у нас есть просто указатель на инт
};
void bar(int (*arr)[3]) {
// тут мы даже сможем получить sizeof(*arr) благодаря длине в типе
};
int main(void) {
int arr[3] = {1,2,3};
foo(arr);
bar(&arr);
}
Причем в случае когда мы передаем просто ссылку на первый элемент как в функции foo у нас нет никакой гарантии, что туда передается именно массив. Никто не запретит мне в main сделать так -
int i = 5;
foo(&i);
Когда параметр имеет такую запись int (*p)[3], точно так же как и с foo нет никакой гарантии, что это будет двумерный массив, возможно кто-то передаст одномерный массив как в примере с bar. А указатель на двумерный масив насколько я понимаю будет выглядеть как то так - int (*arr)[3][3]
int arr[3] - arr это массив из трех элементов, где каждый элемент это инт
int *arr[3] - arr это массива из трех элементов, где каждый элемент это указатель на инт
int (*arr)[3] - arr это указатель на массив из трех элементов, где каждый элемент это инт
Ну в принципе, всё то, что уважаемый преподаватель и сказал в видео 😂
@@Grandize Не совсем. Я выше всё расписал.
указатель на двумерный массив это int (*arr)[3][3]
а int (*arr)[3] это указатель на одномерный массив из 3ех интов и ради примера я передал в функцию bar одномерный массив, где аргумент имеет ровно такой же тип.
Это все равно что сказать что int *num это обязательно указатель на массив из интов, а не просто указатель на инт