#43. Указатели как параметры. Передача массивов в функции | Язык C для начинающих

  Рет қаралды 7,010

selfedu

selfedu

Жыл бұрын

Практический курс по C/C++: stepik.org/course/193691/
Телеграм-канал: t.me/java_and_c
Инфо-сайт: proproprogs.ru/c_base
Использование указателей в качестве параметров функции. Способы передачи массивов через указатели функциям. Передача многомерных массивов.

Пікірлер: 28
@user-hc1uc6zq7y
@user-hc1uc6zq7y 2 ай бұрын
единственный человек в ютубе, кто смог это тему втолдычить :) в голову спасибо большущее!!
@andredru4278
@andredru4278 5 ай бұрын
Спасибо. Восторг!
@user-cm1ri1sn2u
@user-cm1ri1sn2u Жыл бұрын
Здравствуйте, Сергей. Очень надеюсь, что на основе этой серии роликов вы сделаете курс на степик, подобно вашему великолепному курсу по пайтону (и ООП)
@weerbox
@weerbox Жыл бұрын
По вопросу передачи двухмерного массива в функцию и второго сбособа (использование одномерного массива вместо двухмерного). Можно сделать по-другому, не менять исходный массив на одномерный, а кастить и передавать двухмерный массив в функцию как одномерный (int*). Оно и логично, зачем заменять двухмерный массив одномерным, если в памяти двухмерный (статический) массив и так располагается как одномерный. А внутри функции адреса элементов массива вычислять через адресную арифметику. Например: void func(int *ar, int rows, int cols) { for (int j=0; j < rows; ++j) for (int i=0; i < cols; ++i) printf("%d", *(ar + cols*j + i)); } int main() { int a[][3] = { {1, 2, 3}, {5, 6, 7} }; func( (int*)a, 2, 3); return 0; }
@olegkomlev
@olegkomlev 4 ай бұрын
Функция find_space возвращает указатель на первый пробел строки, но что она возвратит, если пробелов в строке нет? Ведь тогда цикл while завершается при достижении символа \0 в конце строки , а потом завершается вся функция без определения возвращаемого значения. Результат функции в этом случае неопределен. Лучше предусмотреть такой случай и сделать, чтобы функция вернула, например, пустой указатель, как знак, что пробел не найден. Для этого достаточно в конце функции написать оператор "return NULL;"
@selfedu_rus
@selfedu_rus 4 ай бұрын
Согласен!
@arzamas1988
@arzamas1988 Жыл бұрын
Я видимо тупой, но как работают указатели в сях я понял только после того, как немного разобрался с ассемблером x86, с различными спосоьами адресации. Прям как пазл сложился, после того как вкурил тему с 'указателями' в асм.
@mslq
@mslq Жыл бұрын
да на таком уровне разницы кода между асмом и сями нет )
@mslq
@mslq Жыл бұрын
люблю асм, только сейчас меговский юзаю, пришлось питон учить, нужно приложение в компе чтобы девайсу товарный вид придать.
@telebumba4348
@telebumba4348 9 ай бұрын
спасибо за видео!! скажите пожалуйста, зачем столько const char* -ов ?😰
@artefek7300
@artefek7300 Ай бұрын
Const char* - это можно сказать строка, если по другому то компилятор будет переменную воспринимать как не строку
@pewpewpew8613
@pewpewpew8613 6 ай бұрын
а подскажи чем такой вариант лучше/хуже чем передача указателя на первый подмассив с укзаанием кол-ва "строк" или чем использование одномерного массива? void print_arr2D(int rows, int cols, int arr[rows][cols]) { for(int i = 0; i < rows; i++) { for(int j = 0; j < cols; j++) { printf("%d ", arr[i][j]); } putchar(' '); } } int main() { int arr[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}}; print_arr2D(3, 4, arr); return 0; }
@selfedu_rus
@selfedu_rus 6 ай бұрын
тут, скорее, дело удобства, и ваше решение хорошее
@user-zw3dt4qx3i
@user-zw3dt4qx3i Жыл бұрын
Может вопрос еще не по теме, однако, как достучаться до локальной переменной в прерывании не создавая глобальных? //таймер по переполнению ISR (TIM0_OVF_vect) { ++a; //ругается на область видимости🤔 } int main(void) { static int a=5; while(1) { asm("cli"); if(a>30) a=5; asm("sei"); } return 0; }
@selfedu_rus
@selfedu_rus Жыл бұрын
надо как то адрес переменной передавать в функцию, по другому - никак
@nickname5906
@nickname5906 Жыл бұрын
А в чем проблема сделать 'a' глобальной? Другого пути здесь нет.
@user-zw3dt4qx3i
@user-zw3dt4qx3i Жыл бұрын
Можно, но постоянно говорят про дурной тон программирования, вот я решил спросить😁
@nickname5906
@nickname5906 Жыл бұрын
@@user-zw3dt4qx3i ничего дурного тут нет, если делать с умом)
@mslq
@mslq Жыл бұрын
Это блин не питон, чтобы без промежуточной переменной обменять значения в ячейках ))
@yore4226
@yore4226 Жыл бұрын
т.е. вы не заметили на экране строчку: int t = a; да и в питоне все делается без каких-то новых переменных, если мы говорим про ячейки памяти.
@mslq
@mslq Жыл бұрын
@@yore4226 t и есть промежуточная переменная через которую и происходит обмен, что не требуется в питоне, не пойму ваш комент о чём. Может вы как то мою речь трактуете не так, не понимаете сложных форм, я проверил её, все знаки препинания на месте.
@yore4226
@yore4226 Жыл бұрын
@@mslq Странно, но при прочтении, смысл вашего комментария, в моей голове, получается строго обратный. С вашим дополнением все встало на место. Звиняйте. З.Ы. А запятых, если что, малость не хватает. :)
@nickname5906
@nickname5906 Жыл бұрын
значит на уровне транслятора вводится промежуточная переменная, а по другому на физическом уровне никак
@mslq
@mslq Жыл бұрын
@@nickname5906 ну питон я так понял написан для человеков, а не для машины, он человечный, добрый, отзывчивый, понятный. По этому и не нужна промежуточная переменная, А СИ это тот же ACM, только весь в макро, у меня самого всё в макросах, на ATmega пишу, си не признаю.
We Got Expelled From Scholl After This...
00:10
Jojo Sim
Рет қаралды 52 МЛН
Increíble final 😱
00:37
Juan De Dios Pantoja 2
Рет қаралды 94 МЛН
java(theory + programs )
9:50
Gaurav's Academy
Рет қаралды 8
Собеседование Junior C++
45:32
Ambushed Raccoon
Рет қаралды 100 М.
Адреса и указатели в Си. Адресная арифметика
27:47
Тимофей Хирьянов
Рет қаралды 159 М.
Добро пожаловать в C++
16:08
Winderton
Рет қаралды 446 М.
Изучение Си в одном видео уроке за час!
57:15
Гоша Дударь
Рет қаралды 514 М.
We Got Expelled From Scholl After This...
00:10
Jojo Sim
Рет қаралды 52 МЛН