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