Лекция 3 2017 Динамическая память, указатели на функции, символы, строки (Лекции (2017))
Описание файла
Файл "Лекция 3 2017 Динамическая память, указатели на функции, символы, строки" внутри архива находится в следующих папках: Лекции 2017, Лекции 2017. PDF-файл из архива "Лекции (2017)", который расположен в категории "". Всё это находится в предмете "программирование" из 2 семестр, которые можно найти в файловом архиве НГУ. Не смотря на прямую связь этого архива с НГУ, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст из PDF
ࡏфӐӌӍҺӝ ӎӏӍһӏҸӋӋӄӏӍҺҸӌӄӨсҿӈӗӄӨ ॏ ߟࡈ ߝߢ ӋҸӏӑҸ ߞߜߝߣ һࡏࡏhttp://xkcd.ru/371ࡏщӈҸӃҸӑҿӊӄ ӎӏӍҾӍӊӂҿӌӄҿࡏࡏщӈҸӃҸӑҿӊӛࡈ ӌӄӈӒҾҸ ӌҿ ӒӈҸӃӝҺҸӧәӄӅNULL ࡴ ӐӎҿӗӄҸӊӛӌӍҿ ӈӍӌӐӑҸӌӑӌӍҿ ӃӌҸӖҿӌӄҿࡈ ӐӄӋҺӍӊӄӃӄӏӒӧәҿҿࡈ ӖӑӍӒӈҸӃҸӑҿӊӛ ӌҿ ӒӈҸӃӝҺҸҿӑ ӌӄ ӌҸ ӈҸӈӒӧ ӎҸӋӨӑӛࡏ фҹӜӨҺӊҿӌӍ Һ ӃҸһӍӊӍҺӍӖӌӍӋӔҸӅӊҿ stdlib.hࡏint* ptr = NULL;int value = *ptr; // run time error*ptr = 37; // run time errorцҸӃӌӝҿ ӌҸӃҺҸӌӄӨࡈ ӌӍ ӐӒӑӛ ӍҾӌҸ ɯƚǃȒƚȘɾŏɾǞȩȘ ǀŏʕȀɾࡈ ɯƚǃǀŏʕȀɾࡈ ŏżżƚɯɯ ʲǞȩȀŏɾǞȩȘࡈࢀхӏӍһӏҸӋӋҸ ҺӝӎӍӊӌӄӊҸ ӌҿҾӍӎӒӐӑӄӋӒӧ ӍӎҿӏҸӗӄӧࡊࢁࡈ ࡊࡏߟࡏщӈҸӃҸӑҿӊӛࡈ ӒӈҸӃӝҺҸӧәӄӅ ӕӍӑӛ ӈӒҾҸvoid* ࡴ ӐӎҿӗӄҸӊӛӌӝӅ ӑӄӎ ӒӈҸӃҸӑҿӊӨࡈ ӈӍӑӍӏӝӅ ӋӍӂҿӑ ӒӈҸӃӝҺҸӑӛ ӌҸ ӊӧҹӝҿҾҸӌӌӝҿ Һ ӎҸӋӨӑӄࡏ тӍӂҿӑ ҹӝӑӛ ӎӏӄҺҿҾҿӌ ӈ ӊӧҹӍӋӒ ҾӏӒһӍӋӒ ӑӄӎӒ ӒӈҸӃҸӑҿӊҿӅ ӄӍҹӏҸӑӌӍࡏdouble x = 37;double* px = &x;void* p = px;int* py = p;шӊӒӘӗӎҾ ӚӊӐӓӖӓӚӊӊࡋ ࢂхҾӎӓӀҾ ӔӕӊӕӓӄҾ ʮȧǝƆࡓࢃ ࡶ ӖӔӕӓӖӊӐ ӘӜӊӗӅӐӡࡌ ࡎhttp://thecodelesscode.com/case/5?lang=ruߠࡏеӄӌҸӋӄӖҿӐӈҸӨ ӎҸӋӨӑӛࡏࡏхӏҿӄӋӒәҿӐӑҺҸ ҾӄӌҸӋӄӖҿӐӈӍӅ ӎҸӋӨӑӄࡄ бӝҾҿӊӨҿӑӐӨ ӄ ӍӐҺӍҹӍӂҾҸҿӑӐӨ ҾӄӌҸӋӄӖҿӐӈӄ ӎӍ ӃҸӎӏӍӐӒ ӎӏӍһӏҸӋӋӝࡏࡄ цҸӃӋҿӏ ӃҸҾҸҿӑӐӨ ҾӄӌҸӋӄӖҿӐӈӄࡏߢࡏбӝҾҿӊҿӌӄҿ ҹӊӍӈҸ ӎҸӋӨӑӄvoid* malloc(size_t size);ыӒӌӈӗӄӨ ҺӝҾҿӊӨҿӑ ҹӊӍӈ ӎҸӋӨӑӄ ӏҸӃӋҿӏӍӋ size ҹҸӅӑ ӄ ҺӍӃҺӏҸәҸҿӑ ӒӈҸӃҸӑҿӊӛӌҸ ӌҸӖҸӊӍ ҹӊӍӈҸࡏ б ӐӊӒӖҸҿࡈ ҿӐӊӄ ӎҸӋӨӑӛ ҺӝҾҿӊӄӑӛ ӌҿ ӎӍӊӒӖӄӊӍӐӛࡈ ҺӍӃҺӏҸәҸҿӑNULLࡏ фҹӜӨҺӊҿӌҸ Һ ӃҸһӍӊӍҺӍӖӌӍӋ ӔҸӅӊҿ stdlib.hࡏߣࡏфӐҺӍҹӍӂҾҿӌӄҿ ҹӊӍӈҸ ӎҸӋӨӑӄvoid free(void* ptr);ыӒӌӈӗӄӨ ӍӐҺӍҹӍӂҾҸҿӑ ҹӊӍӈ ӎҸӋӨӑӄࡏ жӐӊӄ ptr ӏҸҺҿӌ NULLࡈ ӌӄӖҿһӍ ӌҿ ҾҿӊҸҿӑࡏфҹӜӨҺӊҿӌҸ Һ ӃҸһӍӊӍҺӍӖӌӍӋ ӔҸӅӊҿ stdlib.hࡏхӍӐӊҿ ҺӝӃӍҺҸ ӃӌҸӖҿӌӄҿ ӒӈҸӃҸӑҿӊӨ ptr ӍӐӑҸҿӑӐӨ ӎӏҿӂӌӄӋࡈ ӌӍӏҸӃӝӋҿӌӍҺӝҺҸӑӛ ҿһӍ ӌҿӊӛӃӨࡏуҿӄӐӎӍӊӛӃӒҿӋӒӧ ӎҸӋӨӑӛ ӌӒӂӌӍ ӍҹӨӃҸӑҿӊӛӌӍ ӍӐҺӍҹӍӂҾҸӑӛࡈ ӄӌҸӖҿ ӏҸӌӍ ӄӊӄӎӍӃҾӌӍ ӍӌҸ ӋӍӂҿӑ ӈӍӌӖӄӑӛӐӨ ӒӑҿӖӈҸ ӎҸӋӨӑӄࡏߤࡏхӏӄӋҿӏࡇ ӋҸӐӐӄҺ ҾӄӌҸӋӄӖҿӐӈӍһӍ ӏҸӃӋҿӏҸࡏint n = read_number(); // 5int* p; // ???ߥࡏхӏӄӋҿӏࡇ ӋҸӐӐӄҺ ҾӄӌҸӋӄӖҿӐӈӍһӍ ӏҸӃӋҿӏҸࡏࡐࡐࡐࡐࡐࡐࡐࡐࡐ0x100ࡐࡐࡐࡐࡐࡐ0x113int n = read_number(); // 5int* p; // 0x100p = malloc(n * sizeof(int));if (p == NULL) { /* error */ }ߥࡏхӏӄӋҿӏࡇ ӋҸӐӐӄҺ ҾӄӌҸӋӄӖҿӐӈӍһӍ ӏҸӃӋҿӏҸࡏߟߣࡐࡐࡐ0x100ߟߣࡐࡐࡐߟߣ0x113int n = read_number(); // 5int* p; // 0x100p = malloc(n * sizeof(int));if (p == NULL) { /* error */ }p[0] = p[n/2] = p[n-1] = 37;ߥࡏхӏӄӋҿӏࡇ ӋҸӐӐӄҺ ҾӄӌҸӋӄӖҿӐӈӍһӍ ӏҸӃӋҿӏҸࡏࡐࡐࡐࡐࡐࡐࡐࡐࡐ0x100ࡐࡐࡐࡐࡐࡐ0x113int n = read_number(); // 5int* p; // 0x100p = malloc(n * sizeof(int));if (p == NULL) { /* error */ }p[0] = p[n/2] = p[n-1] = 37;free(p);ߥࡏщӈҸӃҸӑҿӊӄ ӌҸ ӔӒӌӈӗӄӄࡏࡏыӒӌӈӗӄӄ ӈҸӈ ҾҸӌӌӝҿб ӨӃӝӈҿ + Ӑ ӔӒӌӈӗӄӨӋӄ ӋӍӂӌӍ ӏҸҹӍӑҸӑӛ ӈҸӈ Ӑ ҾҸӌӌӝӋӄࡇdouble (*my_func)(double, double) = pow;double x = my_func(3, 2); // x = 9.0ыӒӌӈӗӄӨ ࡴ ӢӑӍ ӌҸҹӍӏ ҹҸӅӑӍҺ Һ ӎҸӋӨӑӄࡈ ӈӍҾӄӏӒӧәӄӕ ӑҿӊӍ ӢӑӍӅ ӔӒӌӈӗӄӄ ӐӎӍӋӍәӛӧ ӋҸӘӄӌӌӝӕ ӈӍӋҸӌҾࡏ кӌҸӖӄӑࡈ ӋӍӂӌӍ ҺӃӨӑӛ ҸҾӏҿӐ ӢӑӍһӍ ࢀӌҸҹӍӏҸҹҸӅӑӍҺࢁࡏаӍӊҿҿ ӔӍӏӋҸӊӛӌӍࡇdouble (*my_func)(double, double) = &pow;double x = (*my_func)(3, 2); // x = 9.0ߝߝࡏхӏӄӋҿӏ ӖӄӐӊҿӌӌӍһӍ ҺӝӖӄӐӊҿӌӄӨ ӎӏӍӄӃҺӍҾӌӍӅ Һ ӑӍӖӈҿdouble diff(double x, double (*f)(double)) {double dx = 0.01;return (f(x + dx) - f(x)) / dx;}double square(double x) {return x * x;}printf("%g\n", diff(M_PI/3, sin)); // 0.495662printf("%g\n", diff(M_PI/6, cos)); // -0.504322printf("%g\n", diff(3, square));// 6.01ߝߞࡏчӄӋҺӍӊӝ ӄ ӈӍҾӄӏӍҺӈӄࡏࡏчӄӋҺӍӊӝ Һ +чӄӋҺӍӊӝ ӃҸҾҸӧӑӐӨ Һ ӍҾӄӌҸӏӌӝӕ ӈҸҺӝӖӈҸӕࡈ ӕӏҸӌӨӑӐӨ Һ ӎҿӏҿӋҿӌӌӝӕ ӑӄӎҸ charࡏchar x = 'H';char y = 'i';printf("%c%c\n", x, y); // HiߝߠࡏпӍҾӄӏӍҺӈӄпӍҾӄӏӍҺӈҸ ࡴ ӐӍӍӑҺҿӑӐӑҺӄҿ ӋҿӂҾӒ ӐӄӋҺӍӊӍӋ ӄ ӗҿӊӍӖӄӐӊҿӌӌӝӋ ӈӍҾӍӋࡏë+vv ࡴ ӔӒӌҾҸӋҿӌӑҸӊӛӌҸӨ ߣࡷҹӄӑӌҸӨ ӈӍҾӄӏӍҺӈҸࡇࡄ ߟߞ ӒӎӏҸҺӊӨӧәӄӕ ӐӄӋҺӍӊҸࡈࡄ '\0'ࡈ ӈӍҾ ߜ ࡴ ӎӒӐӑӍӅ ӐӄӋҺӍӊࡈࡄ '\t'ࡈ ӈӍҾ ߥ ࡴ ӑҸҹӒӊӨӗӄӨࡈࡄ '\n'ࡈ ӈӍҾ ߝߜ ࡴ ӎҿӏҿҺӍҾ ӐӑӏӍӈӄࡈࡄ ࡊࡄ ߥߢ ӄӌӔӍӏӋҸӗӄӍӌӌӝӕ ӐӄӋҺӍӊӍҺࡏࡄ '0'..'9' ࡴ ӗӄӔӏӝࡈࡄ 'a'..'z'ࡈ 'A'..'Z' ࡴ ҹӒӈҺӝࡈࡄ ',', '?', ...
ࡴ ӎӒӌӈӑӒҸӗӄӨࡏࡄ ࡊߝߡࡏчӄӋҺӍӊӝ ӈҸӈ ӖӄӐӊҸchar a = 'X';printf("%c\n", a); // Xprintf("%d\n", a); // 88char b = a + 1;printf("%c\n", b); // YߝߢࡏуҸӗӄӍӌҸӊӛӌӝҿ ӐӄӋҺӍӊӝЯ ӖӑӍ ҾҿӊҸӑӛࡈ ҿӐӊӄ ӕӍӖҿӑӐӨ ӄӐӎӍӊӛӃӍҺҸӑӛ ӈӄӏӄӊӊӄӗӒࡈ ӒӋӊӨӒӑӝ ӄ ӄҿӏӍһӊӄӔӝࡐߤࡷҹӄӑӌӝҿ ӈӄӏӄӊӊӄӖҿӐӈӄҿ ӈӍҾӄӏӍҺӈӄࡈ ҹҸӃӄӏӒӧәӄҿӐӨ ӌҸ ë+vvࡇ пфлࡷߤࡈĦǞȘƇȩʶɯࡷߝߞߡߝࡈ ࡊуҸ ӎӏҸӈӑӄӈҿ ӈҸӈࡷӑӍ ӑҸӈࡇ ӄӘॏӧӜӏӚ ॊӝӕӜөॏӘӡӘӜӏӣӘӚߝߣࡏўӌӄӈӍҾўӌӄӈӍҾ ࡴ ӋӌӍһӍҹҸӅӑӍҺҸӨ ӈӍҾӄӏӍҺӈҸࡈ ӎӍӈӏӝҺҸӧәҸӨ ӎӍӖӑӄ ҺӐҿ ӎӄӐӛӋҿӌӌӝҿӨӃӝӈӄࡏхӍӃҺӍӊӨҿӑ ӈӍҾӄӏӍҺҸӑӛ ߝ ߝߝߞ ߜߢߠ ӐӄӋҺӍӊӍҺࡏ б ҺҿӏӐӄӄ ߥࡏߜࡈ ӄӧӌӛ ߞߜߝߢ һࡏࡈӄӐӎӍӊӛӃӒҿӑӐӨ ӊӄӘӛ ߝߞߤ ߞߟߣࡏчӍҾҿӏӂӄӑ ҺӐҿ ӌҸӗӄӍӌҸӊӛӌӝҿ ӐӄӋҺӍӊӝࡈ ӋҸӑҿӋҸӑӄӖҿӐӈӄҿ ӐӄӋҺӍӊӝࡈ ӐӄӋҺӍӊӝҾӏҿҺӌӄӕ ӎӄӐӛӋҿӌӌӍӐӑҿӅ ӄ ӋӌӍһӍҿ ҾӏӒһӍҿࡈ ҺӈӊӧӖҸӨ ☺ ☹ ӄ ҾҸӂҿ ࡋߝߤࡏчӑӏӍӈӄࡏࡏчӑӏӍӈӄчӑӏӍӈҸ ࡴ ӢӑӍ ӌҸҹӍӏ ӐӄӋҺӍӊӍҺࡏ б ӨӃӝӈҿ + ӐӑӏӍӈӄ ӎӏҿҾӐӑҸҺӊӨӧӑӐӨ Һ ҺӄҾҿӋҸӐӐӄҺӍҺ ӐӄӋҺӍӊӍҺ ӑӄӎҸ charࡏ пӍӌӐӑҸӌӑӌӝҿ ӐӑӏӍӈӄ ӃҸҾҸӧӑӐӨ Һ ҾҺӍӅӌӝӕӈҸҺӝӖӈҸӕࡏеӊӄӌҸ ӐӑӏӍӈӄ ӨҺӌӍ ӌҿ ӕӏҸӌӄӑӐӨࡇ ӎӍӐӊҿ ӎӍӐӊҿҾӌҿһӍ ӐӄӋҺӍӊҸ ӐӑӏӍӈӄ ӕӏҸӌӄӑӐӨӐӎҿӗӄҸӊӛӌӝӅ ӐӄӋҺӍӊ '\0'ࡏchar* str = "Hi";printf("%s\n", str);// Hiprintf("%d - %c\n", str[0], str[0]); // 72 - Hprintf("%d - %c\n", str[1], str[1]); // 105 - iprintf("%d - %c\n", str[2], str[2]); // 0 -ߞߜࡏшӍӌӈӍӐӑӛ Ӑ ӄӌӄӗӄҸӊӄӃҸӗӄҿӅ ӐӑӏӍӈࡄ test ࡴ ӒӈҸӃҸӑҿӊӛ ӌҸ ӈӍӌӐӑҸӌӑӌӒӧ ӐӑӏӍӈӒࡏchar* test = "cat";test[2] = 'r'; // run time errorࡄ test ࡴ ӋҸӐӐӄҺࡈ ӎӏӍӄӌӄӗӄҸӊӄӃӄӏӍҺҸӌӌӝӅ ӈӍӌӐӑҸӌӑӌӍӅ ӐӑӏӍӈӍӅࡏchar test[] = "cat";test[2] = 'r';printf("%s\n", test); // carߞߝࡏпӍӌҿӗ ӑӏҿӑӛҿӅ ӊҿӈӗӄӄߞߞ.