Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
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
73
ОПК, семинар №8
ilya
0
55
ОПК, семинар №6
ilya
0
75
ОПК, семинар №4
ilya
0
110
ОПК, семинар №2
ilya
0
88
Other Decks in Education
See All in Education
東大1年生にJulia教えてみた
matsui_528
7
11k
NUTMEG紹介スライド
mugiiicha
0
530
~キャラ付け考えていますか?~ AI時代だからこそ技術者に求められるセルフブランディングのすゝめ
masakiokuda
7
540
CSS3 and Responsive Web Design - Lecture 5 - Web Technologies (1019888BNR)
signer
PRO
1
3k
Sanapilvet opetuksessa
matleenalaakso
0
34k
あなたの言葉に力を与える、演繹的なアプローチ
logica0419
1
240
外国籍エンジニアの挑戦・新卒半年後、気づきと成長の物語
hypebeans
0
660
Requirements Analysis and Prototyping - Lecture 3 - Human-Computer Interaction (1023841ANR)
signer
PRO
0
1.4k
いわゆる「ふつう」のキャリアを歩んだ人の割合(若者向け)
hysmrk
0
260
HTML5 and the Open Web Platform - Lecture 3 - Web Technologies (1019888BNR)
signer
PRO
2
3.1k
HCI and Interaction Design - Lecture 2 - Human-Computer Interaction (1023841ANR)
signer
PRO
0
1.4k
SJRC 2526
cbtlibrary
0
160
Featured
See All Featured
Embracing the Ebb and Flow
colly
88
4.9k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1k
Designing for Performance
lara
610
69k
Agile that works and the tools we love
rasmusluckow
331
21k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
1.9k
Git: the NoSQL Database
bkeepers
PRO
432
66k
Between Models and Reality
mayunak
0
140
Stop Working from a Prison Cell
hatefulcrawdad
273
21k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.6k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
400
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.1k
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 );