포인터 배열이란?
배열형태인데 배열 각각에 주소가 들어간다
즉, 배열의 요소가 포인터(메모리주소)로 이루어진 것
배열 포인터와 포인터 배열의 비교해보자
이제껏 배웠던 '배열 포인터'
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
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
'iOS > 정보처리기사' 카테고리의 다른 글
[정보처리기사] C언어 - 배열 포인터 (0) | 2022.06.20 |
---|---|
[정보처리기사] C언어 - 구조체, 포인터 구조체.. (0) | 2022.06.17 |
[정보처리기사] C언어 - 2차원 배열과 포인터 (0) | 2022.06.13 |
[정보처리기사] C언어 - 배열과 포인터(배열에도 주소값이 있다) (0) | 2022.06.10 |
[정보처리기사] C언어 - scanf 와 변수(feat. 포인터 변수) (0) | 2022.06.09 |