01
⭐포인터 배열 : 배열의 요소가 포인터(메모리주소)로 이루어진 것
01)
char a[3] = {'a','b','c'}
a[0] a 100 |
a[1] b 101 |
a[2] c 102 |
a의 주소값 = 100
printf("%s", a) a의 주소값을 받아서 문자열 출력(null문자를 만날때까지 출력) -> abc
02)
char *str = "hello"; // 포인터 str 선언하고 char 이므로 hello 들어감, str 그 차제로 따져서 주소값은 100임
h | e | l | l | o |
str의 주소값 = 100
printf("%s", str) -> hello
03)
char *student[3] = {"aaa", "bbb", "ccc"}; // 포인터 student 선언하고 student 그 자체로 따져서 주소값이 100
주소 : 20 |
30 |
40 |
요소가 아래와 같이 문자열로 들어가있음
주소가 20
a | a | a |
주소가 30
b | b | b |
주소가 40
c | c | c |
정리하자면, 포인터 인데 배열로 받는다면, 배열의 요소에는 주소값이 들어간다
문제)
#include <stdio.h>
int main() {
static char *c[] = {"aaa","bbb","ccc"};
printf("%s", *(c+1));
}
포인터 c 배열, 주소는 100 이라고 함, 배열의 요소에는 주소값이 들어간다
주소 : 20 100 |
30 101 |
40 102 |
배열의 요소들이 문자열로 들어가있음
메모리 어딘가에 아래와같이 저장되있을 것임
주소가 20
a | a | a |
주소가 30
b | b | b |
주소가 40
c | c | c |
printf 문에서 *(c+1)은 *(101) 이 되고 101주소의 값을 가져와야 함 -> 30주소
printf("%s") 이므로 30주소에 해당하는 값들 bbb 출력함
정답 : bbb
02
#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 선언, array1 의 주소=100
array[0] 값: 주소20 주소: 100 |
array[1] 값: 주소50 주소: 101 |
주소20
g 주소20 |
o 21 |
o 22 |
d 23 |
24 |
m 25 |
o 26 |
r 27 |
n 28 |
i 29 |
n 30 |
g 31 |
주소50
c 50 |
51 |
l 52 |
a ... |
n | g | u | a | g | e |
printf("%s\n", array1[0]+5); -> 20+5 = 25주소, %s 는 문자열 출력이므로 25주소에 해당하는 m부터 null이 나올때까지 출력
즉, morning 출력
printf("%c\n", *(array1[1]+6)); -> 50+6 = 56주소, 56주소의 값을 반환, %c 이므로 문자출력, u 출력
정답:
morning
u
03
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][0] -3 100 |
[0][1] 14 101 |
[0][2] 5 102 |
a[1][0] 1 103 |
-10 104 |
8 105 |
*b[] -> 요소에 주소 저장, b의 주소=200
a[0] 주소: 200 값: 주소100 |
a[1] 201 값: 주소103 |
*p = b[1] -> 포인터 p 에 b[1]값 저장, 주소103 저장
printf문에서 *b[1] 은 주소103 이고 주소103의 값을 반환해야 하므로 1 출력
*(++p) 은 *(104)되고 104주소의 값을 반환해야 하므로 -10 출력
*(--p-2) 는 *(103-2) 이고 *(101)이므로 101의 주소값 반환해야 하므로 14출력
정답: 1 -10 14
04
#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, arr의 주소=100
arr[0] 값: &a (주소200이 들어감) 주소: 100 |
&b(300) 101 |
&c(400) 102 |
일반 변수 a, b, c
a, 주소=200
12 |
b, 주소=300
24 |
c, 주소=400
36 |
printf 문에서 *arr[1] + **arr + 1 에서
*arr[1]는, *(&b)이고 &b의 주소가 300이므로 주소300인 곳의 값을 반환하면 24
**arr 는, **(주소100)이고 *(주소100)을 하면 주소200, *(주소200)을 하면 12
즉, 24 + 12 + 1 = 37
정답: 37
'언어 > C' 카테고리의 다른 글
배열과 포인터 핵심정리 (0) | 2022.10.14 |
---|---|
2차원 배열과 포인터 (0) | 2022.10.13 |
[c언어] 배열과 포인터 (0) | 2022.10.13 |
[C언어] 비트연산자 (0) | 2022.07.21 |
[C언어] 사용자 정의 함수 (0) | 2022.07.11 |
댓글