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
85
Other Decks in Education
See All in Education
2025/06/05_読み漁り学習
nag8
0
140
マネジメント「される側」 こそ覚悟を決めろ
nao_randd
10
5.3k
ANS-C01_2回不合格から合格までの道程
amarelo_n24
1
240
登壇未経験者のための登壇戦略~LTは設計が9割!!!~
masakiokuda
2
480
SkimaTalk Tutorial for Corporate Customers
skimatalk
0
280
SkimaTalk Introduction for Students
skimatalk
0
380
『会社を知ってもらう』から『安心して活躍してもらう』までの プロセスとフロー
sasakendayo
0
230
技術文章を書くための執筆技術と実践法(パラグラフライティング)
hisashiishihara
18
6.5k
IMU-00 Pi
kanaya
0
360
Virtual and Augmented Reality - Lecture 8 - Next Generation User Interfaces (4018166FNR)
signer
PRO
0
1.7k
社外コミュニティと「学び」を考える
alchemy1115
2
170
Visualisation Techniques - Lecture 8 - Information Visualisation (4019538FNR)
signer
PRO
0
2.4k
Featured
See All Featured
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
44
2.4k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
161
15k
KATA
mclloyd
29
14k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.7k
Side Projects
sachag
455
42k
Designing for humans not robots
tammielis
253
25k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
48
2.8k
Optimizing for Happiness
mojombo
379
70k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
How to Ace a Technical Interview
jacobian
277
23k
Producing Creativity
orderedlist
PRO
346
40k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
29
1.8k
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 );