Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Программирование на ЯВУ, семинар 3
Search
Ilya
September 15, 2015
Education
0
160
Программирование на ЯВУ, семинар 3
Указатели, динамическая память, файлы.
Ilya
September 15, 2015
Tweet
Share
More Decks by Ilya
See All by Ilya
Программирование на ЯВУ, семинар 2
ilya
0
72
ОПК, семинар №8
ilya
0
54
ОПК, семинар №6
ilya
0
74
ОПК, семинар №4
ilya
0
110
ОПК, семинар №2
ilya
0
86
Other Decks in Education
See All in Education
~キャラ付け考えていますか?~ AI時代だからこそ技術者に求められるセルフブランディングのすゝめ
masakiokuda
7
470
アントレプレナーシップ教育 ~ 自分で自分の幸せを決めるために ~
yoshizaki
0
170
データで見る赤ちゃんの成長
syuchimu
0
270
H5P-työkalut
matleenalaakso
4
40k
万博非公式マップとFOSS4G
barsaka2
0
1.1k
20250830_MIEE祭_会社員視点での学びのヒント
ponponmikankan
1
160
理想の英語力に一直線!最高効率な英語学習のすゝめ
logica0419
6
390
相互コミュニケーションの難しさ
masakiokuda
0
220
(キラキラ)人事教育担当のつらみ~教育担当として知っておくポイント~
masakiokuda
0
140
大学院進学について(2025年度版)
imash
0
120
学びは趣味の延長線
ohmori_yusuke
0
110
チーム開発における責任と感謝の話
ssk1991
0
250
Featured
See All Featured
The Power of CSS Pseudo Elements
geoffreycrofte
77
6k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
229
22k
RailsConf 2023
tenderlove
30
1.2k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
358
30k
Stop Working from a Prison Cell
hatefulcrawdad
271
21k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
36
2.5k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
34
6k
Embracing the Ebb and Flow
colly
87
4.8k
Build The Right Thing And Hit Your Dates
maggiecrowley
37
2.9k
Git: the NoSQL Database
bkeepers
PRO
431
66k
Transcript
Указатели, начало void increment(int x) { x++; printf("Increment: %d\n", x);
} void main() { int newx = 5; increment(newx); printf("Result: %d\n", newx); } > Increment: 6 > Result: 5
#define SIZE 3 void shuffle(double array[], unsigned size) { //
sizeof(array) == 8 ! } void main() { unsigned i; double array[SIZE] = {1.0, 2.0, 3.0}; shuffle(array, SIZE); for(i = 0; i < SIZE; i++) { printf("%.0lf ", array[i]); } } > 3 1 2
void main() { int newx = 5; scanf("%d", &newx); printf("Result:
%d\n", newx); } < 3 > Result: 3
Указатель — число, адрес в памяти. Диапазон значений зависит от
архитектуры процессора. Специальное значение — NULL.
void main() { int x = 5; int *px; px
= &x; // 0x7fff2a4defd4 printf("%d %d; %p\n", x, *px, px); (*px)++; printf("%d %d; %p\n", x, *px, px); } > 5 5; 0x7ffff8626ad4 > 6 6; 0x7ffff8626ad4 Работа с указателями
int newx; printf("%p", &newx); // 0x7fffc6c02cc4 printf("%p", &newy); // 0x7fffc6c02cc8
printf("%p", array); // 0x7fffc6c02ccc // 0x7fffc6c02cd0 // 0x7fffc6c02cd4 int newy; int array[3];
int newx; printf("%p", &newx); // 0x7fffc6c02cc4 printf("%p", &newy); // 0x7fffc6c02cc8
printf("%p", array); // 0x7fffc6c02ccc // 0x7fffc6c02cd0 // 0x7fffc6c02cd4 int newy; int array[3]; int *pointer = array;
int newx; printf("%p", &newx); // 0x7fffc6c02cc4 printf("%p", &newy); // 0x7fffc6c02cc8
printf("%p", array); // 0x7fffc6c02ccc // 0x7fffc6c02cd0 // 0x7fffc6c02cd4 int newy; int array[3]; int *pointer = array; pointer++;
void main() { int x = 5; int *px; px
= &x; // 0x7fff2a4defd4 printf("%d %d; %p\n", x, *px, px); (*px)++; printf("%d %d; %p\n", x, *px, px); *px++; printf("%d %d; %p\n", x, *px, px); } > 5 5; 0x7ffff8626ad4 > 6 6; 0x7ffff8626ad4 > 6 -127767848; 0x7ffff8626ad8 Подводный камень №1
Подводный камень №2 void func() { int x = 5;
// объявление указателя + присваивание int *px = &x; *px = &x; // не работает, тип *px - int px = &x; // присваивание }
Коды возврата void make_fibonacci(int n, int output[]) { if (n
< 0) // ? Как объяснить, что не так? }
// Возвращает 1 в случае успеха, 0 иначе int make_fibonacci(int
n, int output[]) { if (n < 0) { return 0; } // … return 1; } void main() { … if (make_fibonacci(n, output) != 0) { // Счастье, радость } }
Указатели и коды возврата: веселее вместе size_t fread( void *buffer,
size_t size, size_t count, FILE *stream ); fread returns the number of full items actually read, which may be less than count if an error occurs or if the end of the file is encountered before reaching count.
Массивы и указатели int array[4]; array[0], *(array + 0) array[2],
*(array + 2) int int int int int int int int int int int int
Массивы и указатели int array[4]; 0[array] 2[array] int int int
int int int int int int int int int
Массивы против указателей void shuffle(int *px, size_t n) { //
... } void shuffle(int px[], size_t n) { // ... }
Пустота и преобразование void main() { void *pointer; int x
= 5; pointer = &x; int *px = (int *) pointer; printf("%d\n", *px); }
Подводный камень №3 void main() { void *pointer; int x
= 5; pointer = &x; float *px = (float *) pointer; printf("%d\n", *px); } > -1679649000
Подводный камень №4 void main() { float f = 1.0;
char c = 'a'; printf("%f\n", (char) f); } > 0.000000
Динамическая память #include <malloc.h> void *malloc(size_t size); void free(void *memblock);
void *realloc(void *memblock, size_t size); void *calloc(size_t num, size_t size); void *memset(void *dest, int c, size_t count);
#include <malloc.h> #include <stdio.h> void main() { int *array =
NULL; int i; unsigned size; if(scanf("%u", &size) == 0) { return; } array = (int *) malloc(size * sizeof(int)); if(array == NULL) { return; } for(i = 0; i < size; i++) { array[i] = i; } free(array); }
array = (int *) calloc(size, sizeof(int)); for(i = 0; i
< size; i++) { printf("%d ", array[i]); } < 4 > 0 0 0 0
Файлы FILE *fopen( сonst char *filename, const char *mode); //
mode = r, w+, ab size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream); int fclose(FILE *stream);
#include <malloc.h> #include <string.h> #include <stdio.h> void main() { FILE*
file; size_t written; file = fopen("test.txt", "w"); if (file == NULL) { return; } char msg[] = "Hello, World!"; written = fwrite(msg, sizeof(char), strlen(msg), file); if (written == 0) { printf("Nothing written :(\n"); } fclose(file); }
int msg[] = {1, 2, 3, 4, 5}; written =
fwrite(msg, sizeof(int), 5, file); > cat test.txt > ^A^@^@^@^B^@^@^@^C^@^@^@^D^@^@^@^E^@^@^@
#define SIZE 5 void main() { FILE* file; size_t read;
int i; file = fopen("test.txt", "r"); if (file == NULL) { ... } int* message = (int*) malloc(SIZE * sizeof(int)); if (message == NULL) { ... fclose(file); } read = fread(message, sizeof(int), SIZE, file); if (read < SIZE) { printf("Read less than expected: %d\n", read); } for(i = 0; i < read; i++) { printf("%d ", message[i]); } free(message); fclose(file); }
int count, total = 0; char buffer[100]; FILE *stream; fopen_s(&stream,
"crt_feof.txt", "r"); if(stream == NULL) exit(1); while(!feof(stream)) { count = fread(buffer, sizeof(char), 100, stream); if(ferror(stream)) { perror("Read error"); break; } total += count; } printf("Number of bytes read = %d\n", total); fclose(stream );