iOS/정보처리기사

[정보처리기사] C언어 - 포인터 배열(배열 포인터와 포인터 배열 차이) feat. 문제로 강화하기

Chafle 2022. 6. 13. 22:49
반응형
포인터 배열이란?


배열형태인데 배열 각각에 주소가 들어간다

즉, 배열의 요소가 포인터(메모리주소)로 이루어진 것

 

 

 


 

 

배열 포인터와 포인터 배열의 비교해보자

 

이제껏 배웠던 '배열 포인터'

 

 

ex1.

 

char a[3] = {'a','b','c'}

a 배열 100번지 101번지 102번지
100번지 a[3] a b c

 

printf("$s₩n", a); = abc.   -> %s는 '문자열'을 출력하는 함수인데 null을 만날 때까지 출력한다.

그래서 주소값 100번지를 받아서 null 직전까지의 문자열 abc를 출력하게 된다.

 

 

 

ex2. 

 

char *str = "Hello"

str 100번지 101번지 102번지 103번지 104번지 105번지
100번지 H e l l o  

 

printf("%s₩n", str); = Hello  -> 마찬가지로 %s는 '문자열'을 출력하는 함수인데 null을 만날 때까지 출력한다.

그래서 주소값 100번지를 받아서 null 직전까지의 문자열 Hello를 출력하게 된다.

 

 

*** 문자열을 출력받기 위해서는 주소를 받아야 한다.

 

 


 

 

포인터 배열

 

 

 

char *student[3] = {"aaa", "bbb", "ccc"}

 

student포인터 변수가 만들어지고

배열요소에 주소값이 들어간다.

표로 표현해 보면

3열짜리 배열이므로 

student   임의의 주소 100번지 임의의 주소 101번지 임의의 주소 102번지
100번지   '여기에 주소가 들어감(주소값X)' '여기에 주소가 들어감(주소값X)' '여기에 주소가 들어감(주소값X)'

 

aaa가 하나의 주소, bbb가 하나의 주소, ccc가 하나의 주소을 받으려면

아래와 같이 배열이 들어가야하고

ex 20번지   a a a
ex 30번지   b b b
ex 40번지   c c c

 

 

최종적으로

student   임의의 주소 100번지 임의의 주소 101번지 임의의 주소 102번지
100번지   20번지 30번지 40번지

 

각각의 주소값이 아니라 주소로 배열의 요소가 채워지게 된다.

 

 

 

 

위 개념으로 문제를 풀어보면

 

 

 

 

주소를 대변하는 번지수는 임의로 풀기 편하게 본인이 각자 정합니다.

저는 무조건 100, 200, 300등으로 시작

 

 


 

 

ex1

 

#include<stdio.h>

int main() {

   static char *c[] = {"aaa", "bbb", "ccc"};

   printf("%s", *(c+1)));

}

 

 

 

해설

 

 

c   임의의 주소 100번지 임의의 주소 100번지 임의의 주소 100번지
100번지   '여기에 주소가 들어감(주소값X)' '여기에 주소가 들어감(주소값X)' '여기에 주소가 들어감(주소값X)'

 

 

ex 20번지   a a a
ex 30번지   b b b
ex 40번지   c c c

 

최종적으로 아래와 같은 상태에서

c   임의의 주소 100번지 임의의 주소 101번지 임의의 주소 102번지
100번지   20번지 30번지 40번지

 

printf("%s", *(c+1)); -> %s 문자열을 출력을 하는데

c는 100번지인 100이고

c+1 = 101이므로

*(c+1) -> c+1의 값은 101번지의 값인 30번지를 null까지 출력하면 되는데

30번지에는 bbb가 들어가있으므로, bbb가 출력된다.

 

답 bbb

 

 


 

ex2

 

#include<stdio.h>

int main() {

char *array1[2] = {"Good morning", "C language"};

printf("%s₩n", array1[0]+5);

printf("%c₩n", *(array1[1]+6));

}

 

 

 

해설

 

array1   100번지 101번지
100번지   20번지 40번지

 

 

20번지 G o o d   m o r n i n g  
  20번지 21번지 22번지 23번지 24번지 25번지 26번지 27번지 28번지 29번지 30번지 31번지  

 

40번지 C   l a n g u a g e  
  40번지 41번지 42번지 43번지 44번지 45번지 46번지 47번지 48번지 49번지  

 

 

printf("%s₩n", array1[0]+5); -> ***문자열을 출력받을 때는 주소값을 받는다.

%s문자열을 null까지 출력할 건데, 문자열을 출력할 주소는 arrary1[0]은 20번지고 20+5 = 25번지 이므로 25번지 값을 찾고 null값까지 출력이 된다. morning

printf("%c₩n", *(array1[1]+6));  -> %c문자 하나를 출력할 건데, array1[1]은 40번지이고 40+6은 46번지이므로 46번지의 값인

문자 u만 출력하게 된다.

 

 

morning

u

 

 


 

 

ex3

 

void main() {

int a[2][3] = {{-3, 14, 5}, {1, -10, 8}};

int *b[] = {a[0], a[1]};

int *p = b[1];

printf("%d", *b[1]);

printf("%d", *(++p));

printf("%d", *(--p-2));

}

 

 

 

해설

 

 

a[2][3]

a   대표행 번지수 배열의 값[번지수] 배열의 값[번지수] 배열의 값[번지수]
100번지 a[0] 100번지 -3[100번지] 14[101번지] 5[102번지]
a[1] 103번지 1[103번지] -10[104번지] 8[105번지]

 

 

*b[] 포인터 배열

배열에 주소가 온다!

b   200번지 201번지
200번지   a[0] = 100번지 a[1] = 103번지

 

*p

b[1]
b[1] = 103번지 a[1]

 

 

printf("%d", *b[1]);  ->b[1]의 값 -> a[1]의 값-> a[1]은 103번지 -> 103번지 값 = 1

printf("%d", *(++p));  -> p=b[1] = a[1] = 103 -> ++p -> 104 -> *(104) -> 104번지의 값 = -10

printf("%d", *(--p-2)); -> p = 104 -> --p -> 103 -> 103-2 = 101 - > *(101) -> 101번지의 값 = 14

 

 

1 -10 14

 

 

 

반응형

 


 

 

ex4

 

#include<stdio.h>

int main() {

int *arr[3] {

int a = 12, b = 24, c = 36;

arr[0] = &a;

arr[1] = &b;

arr[2] = &c;

 

printf("%d₩n", *arr[1] + **arr +1);

}

 

 

 

해설

 

 

*arr[3] 배열포인터

배열에 주소가 온다

arr 100번지 101번지 102번지
100번지 주소 주소 주소

 

 

int a = 12, b = 24, c = 36;

  주소(번지수) 주소값
a 200번지(임의로 정하자) 12 (200번지의 값)
b 300번지(임의로 정하자) 24 (300번지의 값)
c 400번지(임의로 정하자) 36 (400번지의 값)

 

 

arr[0] = &a;  -> &a = a의 주소 -> 임의로 200번지

arr[1] = &b;  -> &b = b의 주소 -> 임의로 300번지

arr[2] = &c;  -> &c = c의 주소  -> 임의로 400번지

 

위의 arr[0], arr[1], arr[2]에 임의로 정한 위 주소를 대입하면

아래와 같다.

 

arr 100번지 101번지 102번지
100번지 200번지 300번지 400번지

 

 

printf("%d₩n", *arr[1] + **arr +1);

 

*arr[1] = arr[1]은 300번지 -> *(300번지) -> 300번지의 값 -> 24

**arr = *arr은 100번지를 참조함 -> 100번지는 200번지의 값을 가짐 -> *(200번지)은 200번지의 값 -> 12

**arr + 1 = 13

 

 

24+13 = 37

 

답: 37

반응형