3. 쉽게 씌어진 C
창밖에 밤비가 속살거려
육첩방은 남의 나라.
C인이란 슬픈 천명인 줄 알면서도
한 줄 C를 적어볼까.
땀내와 사랑내 포근히 품긴
보내주신 학비 봉투를 받아
대학 노―트를 끼고
늙은 교수의 강의 들으러 간다.
생각해보면 어린 때 동무를
하나, 둘, 죄다 잃어버리고
나는 무얼 바라
나는 다만, 홀로 침전하는 것일까?
인생은 살기 어렵다는데
C가 이렇게 쉽게 씌어지는 것은
부끄러운 일이다.
육첩방은 남의 나라
창밖에 밤비가 속살거리는데
등불을 밝혀 어둠을 조금 내몰고
C대처럼 올 아침을 기다리는 최후의 나.
나는 나에게 적은 손을 내밀어
눈물과 위안으로 잡는 최초의 악수.
4. 많은 초보들이 독학으로 C언어를 배우는 과정
1. C언어 책을 삽니다.
2. 책을 펼치고 열심히 공부합니다.
3. 포인터가 나옵니다.
4. 책을 덮습니다.
5. n개월 휴식
6. 1번 또는 2번으로 갑니다.
5. 이 슬라이드 목표는
여러분이 포인터에 대한 작은 깨달음을 얻는 것입니다.
그리고 진실과 다른 내용이 더러 나옵니다.
28. 포인터 (Pointer)
포인터는 주소를 저장하는 특별한 자료형입니다.
그리고 저장한 주소에 가서 값을 읽어옵니다.
그게 전부예요.
거짓말.
한 3% 정도 됩니다.
29. 포인터 (Pointer)
주소를 저장한다구요? 그럼,이게 다 뭔가요?
놀라지 말고 차근차근 하나씩 알아 봅시다 :D
int *ptr;
char *ptr;
void *ptr;
int **pptr;
int *ptr[5];
int (*ptr)[3];
int (*foo)(double a);
30. 배우기 전에 그림을 그리기 위한 규칙을 배웁시다.
그림으로 그리면 조금 이해가 잘 됩니다.
제가 고심해서 만들……
포인터 char int
double
struct
31. 일반 변수의 선언 및 초기화는 아래처럼 그릴 수 있습니다.
int a = 20;
아래의 희미한 건 실제 저장되는 메모리의 시작주소입니
다.
20
a
0x080481AC
32. 포인터 변수는 주소를 저장하는 변수입니다.
형식은 타입 *변수명 이 됩니다.
변수 선언할 때 *는 어떤 변수가 포인터라는 것을 나타냅니다.
아래 선언 코드는 "ptr은 int의 포인터다" 라는 뜻입니다.
ptr
int *ptr;
33. 포인터에는 주소값이 저장됩니다.
이미 & 연산자를 이용해서 주소를 알아올 수 있으므로 사용해 봅시다.
ptr
int a = 20;
int *ptr;
ptr = &a;
20
a
0x080481AC
0x080481AC
34. 동그라미라서 칸이 모자랍니다.
어차피 a의 주소를 가르킨 거니까 그냥 화살표로 연결해 봅시다.
a의 주소도 귀찮으니까 지웁니다.
ptr
int a = 20;
int *ptr;
ptr = &a;
20
a
35. 포인터가 가르키는 변수를 특별히 포인티라고 합시다.
다른 곳에서는 그렇게 안 부르는데
미국의 S대학 자료에서 발견한 멋진 이름입니다.
위 그림의 해석
"포인터 변수 ptr의 포인티는 int a이고 20이 저장되어 있다."
ptr
20
a
44. 포인터의 사용을 위해서는 * 연산자를 사용합니다.
선언이 아닌 곳에서 *를 붙여서 포인티의 값을 읽거나 쓸 수 있습니다.
int a = 20;
int *ptr = &a;
printf("%dn", *ptr) //*ptr이 int라는 걸 알겠죠?
ptr
20
a
ptr의 포인티는 a이므로 *ptr을 읽으면 20이 나옵니다.
45. 포인터를 사용하려면 * 연산자를 사용합니다.
선언이 아닌 곳에서 *를 붙이면 포인티의 값을 읽거나 쓸 수 있습니다.
int a = 20;
int *ptr = &a;
printf("%dn", *ptr) //20
*ptr = 50;
printf("%dn", *ptr) //50
printf("%dn", a) //?
ptr
20 50
a
*ptr에 50을 넣으면 자신이 아니라 포인티가 50이 됩니다.
Make sense?
Reasonable?
LV?? 스마트 데이터
46. 포인터를 사용한다라는 건 결국 *을 사용한다는 것입니다.
그런데 초기화를 해 주지 않으면 포인티가 존재하지 않습니다.
아래 코드를 실행하면 어떻게 될까요? 그림으로 그리면?
int *ptr;
*ptr = 50;
printf("%dn", *ptr) //?
ptr
47. 초기화를 해 주지 않은 포인터는 절대 사용하면 안 됩니다.
그래서 초기화하지 않은 포인터는 아래처럼 그립니다.
ptr
LV.99 가비지 포인터
<엄청난 버그를 양산>
48. 다음 코드의 문제는 무엇인지 실행도 해 보고
그림으로 그려 봅시다.
*참고로 맥에서 GCC로 컴파일하면 잘 실행됩니다.
main() {
int *ptr;
foo(ptr);
}
void foo(int *p) {
*p = 100;
printf(“%dn”, *p);
}