본문 바로가기
언어/C

포인터 배열

by 새벽물망초 2022. 10. 13.

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

 

 

 

https://www.youtube.com/watch?v=LzoeKUnKN2k&list=PLdaE6YENrbZA8sXCvVBUWjFwFI2zb4tlK&index=34&ab_channel=%ED%9D%A5%EB%8B%AC%EC%8C%A4 

 

 

 

 

'언어 > 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

댓글