Working with pointers
This commit is contained in:
parent
12d4f8d626
commit
cdab98000a
9 changed files with 160 additions and 0 deletions
7
.clang-format
Normal file
7
.clang-format
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
---
|
||||||
|
Language: Cpp
|
||||||
|
BasedOnStyle: LLVM
|
||||||
|
IndentWidth: 2
|
||||||
|
UseTab: Never
|
||||||
|
BreakBeforeBraces: Allman
|
||||||
|
AllowShortFunctionsOnASingleLine: None
|
||||||
19
.clangd
Normal file
19
.clangd
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
CompileFlags:
|
||||||
|
Add:
|
||||||
|
- -std=c90
|
||||||
|
- -Wall
|
||||||
|
- -Wextra
|
||||||
|
- -I/home/t0xa/Programming/clang/c_book
|
||||||
|
- -I/home/t0xa/Programming/clang/c_book/exercices/pointers
|
||||||
|
- -I/home/t0xa/Programming/clang/c_book/exercices/functions
|
||||||
|
---
|
||||||
|
If:
|
||||||
|
PathMatch: .*\.h
|
||||||
|
CompileFlags:
|
||||||
|
Remove:
|
||||||
|
- -x
|
||||||
|
- -std=*
|
||||||
|
Add:
|
||||||
|
- -x
|
||||||
|
- c-header
|
||||||
|
- -std=c90
|
||||||
15
exercices/pointers/4_3_getch.c
Normal file
15
exercices/pointers/4_3_getch.c
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "4_3_getch.h"
|
||||||
|
#define BUFSIZE 100
|
||||||
|
|
||||||
|
char buf[BUFSIZE];
|
||||||
|
int bufp = 0;
|
||||||
|
|
||||||
|
int getch(void) { return (bufp > 0) ? buf[--bufp] : getchar(); }
|
||||||
|
|
||||||
|
void ungetch(int c) {
|
||||||
|
if (bufp >= BUFSIZE)
|
||||||
|
printf("ungetch: too many charachters\n");
|
||||||
|
else
|
||||||
|
buf[bufp++] = c;
|
||||||
|
}
|
||||||
4
exercices/pointers/4_3_getch.h
Normal file
4
exercices/pointers/4_3_getch.h
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
#define BUFSIZE 100
|
||||||
|
|
||||||
|
int getch(void);
|
||||||
|
void ungetch(int c);
|
||||||
8
exercices/pointers/5_1.c
Normal file
8
exercices/pointers/5_1.c
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
int main() {
|
||||||
|
int x = 1, y = 2, z[10];
|
||||||
|
int *ip; /* ip - указатель типа int */
|
||||||
|
ip = &x; /* ip теперь указывает на x */
|
||||||
|
y = *ip; /* y теперь равно 1 (т.е. *ip dereference'ит x через указатель и присваивает y) */
|
||||||
|
*ip = 0; /* x теперь равно 0 через указатель */
|
||||||
|
}
|
||||||
14
exercices/pointers/5_1_1.c
Normal file
14
exercices/pointers/5_1_1.c
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
int main() {
|
||||||
|
int x = 1, y;
|
||||||
|
int *ip = &x;
|
||||||
|
*ip = *ip + 10; /* Добавляем 10 к разименованному указателю */
|
||||||
|
y = *ip + 20; /* Добавляем уже к x+10 еще 20 и присваиваем y */
|
||||||
|
printf("x: %d, y: %d\n", x, y);
|
||||||
|
*ip += 1; /* Добавляем 1 к х */
|
||||||
|
printf("x: %d\n", x);
|
||||||
|
++*ip;
|
||||||
|
printf("x: %d\n", x);
|
||||||
|
(*ip)++;
|
||||||
|
printf("x: %d\n", x);
|
||||||
|
}
|
||||||
18
exercices/pointers/5_2_function_args.c
Normal file
18
exercices/pointers/5_2_function_args.c
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
void swap(int *px, int *py) {
|
||||||
|
int temp;
|
||||||
|
|
||||||
|
temp = *py;
|
||||||
|
*px = *py;
|
||||||
|
*px = temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
int x,y;
|
||||||
|
x = 10;
|
||||||
|
y = 20;
|
||||||
|
printf("x=%d, y=%d", x, y);
|
||||||
|
swap(&x, &y);
|
||||||
|
printf("After swap:");
|
||||||
|
printf("x=%d, y=%d", x, y);
|
||||||
|
}
|
||||||
63
exercices/pointers/5_2_getint.c
Normal file
63
exercices/pointers/5_2_getint.c
Normal file
|
|
@ -0,0 +1,63 @@
|
||||||
|
#include "4_3_getch.h"
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Функция чтения первого токена-числа из ввода stdin
|
||||||
|
*
|
||||||
|
* @param pn - указатель на int, в который требуется записать считанное число
|
||||||
|
* @return последний считанный символ `c`
|
||||||
|
*/
|
||||||
|
int getint(int *pn)
|
||||||
|
{
|
||||||
|
int c; /* Это последний считанный символ в процессе работы функции */
|
||||||
|
int sign; /* Тут хранится 1 или -1 в зависимости от того, какой sing пришел у
|
||||||
|
числа */
|
||||||
|
|
||||||
|
/* Пока у нас приходят пробелы - берем следующий символ через getch()) */
|
||||||
|
while (isspace(c = getch()))
|
||||||
|
;
|
||||||
|
|
||||||
|
if (!isdigit(c) && c != EOF && c != '+' && c != '-')
|
||||||
|
{
|
||||||
|
/* В случае, если пришло не число и не знак - пихаем его в буфер.
|
||||||
|
* Пихаем мы в буфер со следующей целью - допустим у нас ситуация:
|
||||||
|
* На вход пришло " x123", тогда получается что на вход пришло не число.
|
||||||
|
* Т.е. getch() уже прочитал "х", то нам его надо как-то вернуть обратно для
|
||||||
|
* следующих парсеров. Следовательно перед тем, как выйти с кодом 0 (что
|
||||||
|
* означает что пришло не число) - мы записываем в буфер значение "х".
|
||||||
|
* Следующий парсер который начнет это читать - начент чтение с "х" из
|
||||||
|
* буфера.*/
|
||||||
|
ungetch(c);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
sign = (c == '-') ? -1 : 1;
|
||||||
|
if (c == '+' || c == '-')
|
||||||
|
c = getch();
|
||||||
|
/*
|
||||||
|
* Пример парсинга "158":
|
||||||
|
* старт: *pn = 0
|
||||||
|
* '1' -> *pn = 10*0 + 1 = 1
|
||||||
|
* '5' -> *pn = 10*1 + 5 = 15
|
||||||
|
* '8' -> *pn = 10*15 + 8 = 158
|
||||||
|
*
|
||||||
|
* Почему (c - '0'):
|
||||||
|
* '0'..'9' идут подряд в ASCII, поэтому разница кодов дает цифру:
|
||||||
|
* '0' - '0' = 0, '5' - '0' = 5, '9' - '0' = 9
|
||||||
|
*/
|
||||||
|
for (*pn = 0; isdigit(c); c = getch())
|
||||||
|
*pn = 10 * *pn + (c - '0');
|
||||||
|
*pn *= sign;
|
||||||
|
if (c != EOF)
|
||||||
|
ungetch(c);
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int getint_result;
|
||||||
|
getint(&getint_result);
|
||||||
|
printf("Scanned int: %d\n", getint_result);
|
||||||
|
}
|
||||||
12
exercices/pointers/generic_pointers.c
Normal file
12
exercices/pointers/generic_pointers.c
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
int main() {
|
||||||
|
int x = 10;
|
||||||
|
double y = 3.14;
|
||||||
|
char c = 'a';
|
||||||
|
|
||||||
|
void *ptr;
|
||||||
|
ptr = &x;
|
||||||
|
printf("%d\n", *(int *)ptr);
|
||||||
|
ptr = &y;
|
||||||
|
printf("%.2f\n", *(double *)ptr);
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue