흥달쌤 C언어 특강 25~28강

이윤설·2024년 6월 17일

흥달쌤 C언어 특강

목록 보기
5/10

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)의 우선순위가 가장 높다.
  1. ptr은 현재 103, i는 0이다. *(103)= 40이고, 40-3 = 37이다.
  2. ptr은 현재 103, i는 1이다. *(104)= 50이고, 50-3 = 47이다.
  3. ptr은 현재 103, i는 2이다. *(105)= 60이고, 60-3 = 57이다.
  4. ptr은 현재 103, i는 3이다. *(106)= 70이고, 70-3 = 67이다.
  5. 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)

스킵. 너무 이상한 문제.

profile
화려한 외면이 아닌 단단한 내면

0개의 댓글