From 4f92638d14b5f553279946117b16e9c9ac478911 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=86=8C=ED=98=84?= <sh119@ajou.ac.kr> Date: Tue, 1 Feb 2022 07:50:44 +0000 Subject: [PATCH] Update README.md --- README.md | 86 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/README.md b/README.md index e1422bb..97dc67e 100644 --- a/README.md +++ b/README.md @@ -370,7 +370,93 @@ int count_one(unsigned int a) } ``` +## lesson06 + +* bash에 있는 빌트인 명령어들은 +>* $man ~ or $which ~ 를 해도 뜨지 않는다. +* $alias cc='cc -Wall' : alias 명령어를 이용하여 cc명령어만 입력하면 자동으로 cc -Wall을 실행하게 만들 수 있다. +* $alias -p : alias 된 것을 모두 보여준다 +* $\# : # 사용을 alias 를 해놓은 것을 사용하지 않고 오리지널을 사용하고 싶을때 \를 붙여 명령한다. +* 일반적으로 alias는 로그아웃을 하면 명령한 것들이 사라진다. 이때 로그아웃 후에도 계속 유지시키고 싶다면 +>* vi ~/.bashrc 로 가서 alias 설정을 해야한다. +>* source !$ : 방금 수행한 것을 컴파일 +>* unalias # : 는 alias로 설정한 #를 없앤다. + +1. pointer +>* usr/include 에 가서 limits.h에 가면 int, long long, 등의 bit수를 확인 가능하다. +>1. "&" 기호 +>>* &a : address operator +>>* a & b : bit wise and operator +>2. void *c : 함수의 포인터 void는 char 포인터와 비슷하지만 다른 용도로 사용된다. + +>* 주소값은 음수가 없으므로 unsigned 값이다. + +* pointer 성질을 보기 위한 실습코드 +```C +#include<stdio.h> + +int add(int *a, int *b, int *c) +{ + *c = *a + *b; +} + +int main() +{ + const int a = 100; + int b = 200; + long long c = 999; + // int * == long long + + fprintf(stdout, "%d : %lld %llx\n", a, &a, &a); + fprintf(stdout, "%d : %lld %llx\n", b, &b, &b); + add(&a, &b ,&c); + //c = a+b + fprintf(stdout, "%d : %lld %llx\n", c, &c, &c); + fprintf(stdout, "%d : %lld %llx\n", c, &c+1, &c+1); + fprintf(stdout, "%d : %lld %llx\n", c, &c+2, &c+2); +} +``` + +## lesson07 + +```C +int main() +{ + const int a = 100; + int b = 200; + int c = 9999; + int *p = &a; + fprintf(stdout, "a b c: %d %d %d\n", a,b,c); + *p = 200; + fprintf(stdout, "a b c: %d %d %d\n", a,b,c); +} +``` +* 위의 코드를 살펴보면 a는 const로 설정되어 있는 것을 볼 수 있는데 아래에서 *p = &a로 정의하고 *p에 200을 넣어줌으로써 a의 값을 변환하고 있다. +* 위와 같은 행동을 하면 const는 수정이 불가능함에도 수정이 되는 것을 볼 수 있다. +* 즉, a 자체에 할당하는 것은 수정이 불가능하지만 포인트를 통해서는 수정이 가능해진다는 것이다. +* 그렇다면 굳이 왜 const를 사용하는 것일까? +>* 왜냐하면 값이 변경될 때 프로그래머에게 경고를 줌으로써 일종의 안전장치를 만들 수 있기 때문이다. + +* 위의 코드에 아래의 코드를 각각 넣어 실행하게 된다면 +```C +int const *p = &a; +int * const q = &a; +``` + * p의 경우 int const 타입을 가르키는 포인터 이므로 p = &b; 를 하여도 에러가 나지 않고 수행이 가능하다. + * 하지만 q 의 경우 const 타입의 포인터가 int를 가르키는 형태로 q 자체가 const이므로 q = &b 를 하게 되면 에러를 뱉어낸다. + * 따라서 int const *p 형태로 정의해야만 pointer 를 통해서 값을 바꿀 수 있게된다. + +* 함수의 포인터 +>* 실습에서 작성한 fnpointer.c 파일을 살펴보면 +```C + void (*fp[4])(int *, int *, int *) = {add, sub, mul, div}; +``` +>* 형태로 함수의 포인터를 정의 한 것을 볼 수 있다. 이때 함수를 배열로 받았는데 (*fp[4])를 받는 위치를 void 바로 뒤에 써야한다. + + * $od : 8진수로 보여줌 + * $od -x : 16진수로 보여줌 + * (ex $od a.out ) ## lesson08 -- GitLab