25강. 배열과 포인터 (1)
배열
int a[7];
길이가 7인 배열을 선언하면, 어딘가에 배열 a가 만들어지고, 메모리 상에 7개의 공간이 만들어진다.
a라는 변수가 갖고있는 주소값은 첫번째(또는 0번째)의 주소값이 a에 들어간다.
만약 0번째 주소값이 100번지라면, a = 100이다.

- 만약 a[0]이 메모리 상에서 100번지라고 가정하면, a의 값에는 100이라는 주소값이 들어간다. 따라서 a[0]은 a의 0번지임과 동시에 100번지가 된다.
- 순서대로 주소는 100, 101, 102.. 이렇게 늘어난다. 왜냐하면 배열은 연속적인 값들을 모아놓은 것이기 때문이다.
- ptr이라는 포인터 변수를 만든다. 그 값으로는 주소값이 들어갈 수 있다.
a+3이므로, 103번지가 들어간다. 따라서 a[3]을 가르킨다.
- for문: 괄호 *(ptr+i)의 우선순위가 가장 높다.

- ptr은 현재 103, i는 0이다. *(103)= 40이고, 40-3 = 37이다.
- ptr은 현재 103, i는 1이다. *(104)= 50이고, 50-3 = 47이다.
- ptr은 현재 103, i는 2이다. *(105)= 60이고, 60-3 = 57이다.
- ptr은 현재 103, i는 3이다. *(106)= 70이고, 70-3 = 67이다.
- ptr은 현재 103, i는 4이다. *(107)= 80이고, 80-3 = 77이다.
따라서 정답은 37 47 57 67 77
26강. 배열과 포인터 (2)
배열과 포인터의 관계

- 포인터도 배열처럼 첨자를 사용할 수 있다.
- 가령 a[0]이 100번지라면, a의 주소값은 100번지다.
- 포인터 변수 b에는 100번지가 들어간다.

- a[2]에 10을 넣는다.
- b[2]는 결국 a[2]이므로, a[2] = 20이 들어간다.
연습문제


- int a[] = {1,2,4,8};
- a[0]이 만약 100번지라면, a의 주소값은 100이다.
- 포인터변수 p의 값은 주소값 100번지가 들어간다.
- p[1] = 3; -> int a[] = 1,3,4,8;
- a[1] = 4; -> int a[] = 1,4,4,8;
- p[2] = 5; -> int p[] = 1,4,5,8;
- a[1] + p[1] = 4 + 4 = 8 (서로 동일한 배열 a을 의미한다.)
- a[2] + p[2] = 5 + 5 = 10
- 따라서 정답은 "8 10"

int *p = a+1;이라고 가정하고 다시 풀어보자.
- p에는 주소값 101이 들어간다.
- p의 값은 101이기 때문에 a[1]이 0번지(p[0]), a[2]를 (p[1]를) 1번지로 인식한다.
- 따라서 int a[] = {1,2,3,8} -> {1,4,3,8} -> {1,4,3,5};
- a[1] = 4, p[1] = 3, a[2] = 3, p[2] = 5다. 따라서 7 + 8 = 15다.
27강. 배열과 포인터 (3)


- a[0]이 100번지라고 가정하면, a의 주소값은 100번지이다.
- a[0]부터 차례대로 10,20,30이 들어간다.
- 포인터 변수 p에는 a의 주소값인 100이 들어간다. 따라서 a와 p 모두 a[0]을 가르킨다.

- p++를 수행하여 p에 101을 넣는다.

- *p++ = 100: 101번지의 값(a[1])에다가 100을 대입하고, p++를 수행하라.

- *++p = 200: 먼저 p를 ++하고(p=103), 103번지의 값에다가 200을 넣어라.
따라서 0,1,2번지를 출력하면 "10 100 30"이다.
28강. 배열과 포인터 (4)
스킵. 너무 이상한 문제.