본문 바로가기

BackEnd/C

포인터 배열

반응형

1. 포인터 변수로 이루어진 배열


포인터 변수도 일반적인 변수로 인식하는것이 중요하다.


포인터 배열은 포인터 변수로 이뤄진 배열이다.


int * arrptr[3]; //int형 포인터 변수3개로 이뤄진 1차원 배열 선언


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

#include <stdio.h>
 
int main(void)
{
    int n1, n2, n3;
    int* arrPtr[3]={&n1, &n2, &n3};
 
    int i;
    for(i=0; i<3; i++)
    {
        printf("숫자 입력: ");
        scanf("%d", arrPtr[i]);
    }
 
    printf("입력된 숫자의 총 합은 %d 입니다 \n"
        *arrPtr[0+ *arrPtr[1+ *arrPtr[2]);
 
    return 0;
}
cs


1
2
3
4
숫자 입력: 1
숫자 입력: 2
숫자 입력: 3
입력된 숫자의 총 합은 6 입니다
cs


6행에서 int형 포인터 배열을 선언하면서 n1,n2,n3의 주소 값으로 배열을 초기화했다.


12행에서 arrPtr[0], arrPtr[1], arrPtr[2] 가 의미하는것은 변수 n1, n2, n3의 주소 값이다.


그래서 굳이 & 연산자를 붙이지 않아도 된다.


2. 3가지 형태의 문자열 배열


1) 2차원 배열 기반의 문자열 배열



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

#include <stdio.h>
 
int main(void)
{
    char stArr[3][9]={
        "Hello2",
        "Business",
        "Pet"
    };
 
    int i;
    for(i=0; i<3; i++)
        printf("문자열 %d: %s \n", i+1, stArr[i]);
 
    return 0;
}
cs

1
2
3
문자열 1: Hello2
문자열 2: Business
문자열 3: Pet
cs


13행에서 배열에 저장된 문자열을 반복문으로 활용해 출력했다.


2) 포인터 기반의 문자열 배열 1



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

#include <stdio.h>
 
int main(void)
{
    char str1[]="Hello";
    char str2[]="Business";
    char str3[]="Pet";
 
    char* stArr[3]={str1, str2, str3};
 
    int i;
    for(i=0; i<3; i++)
        printf("문자열 %d: %s \n", i+1, stArr[i]);
 
    return 0;
}
cs


1
2
3
문자열 1: Hello
문자열 2: Business
문자열 3: Pet
cs


5~7행 문자열의 길이에 딱 맞는 배열을 선언하고 있다.


5~6행의 배열의 이름이 첫번째 배열 요소의 주소 값이므로


9행에서 str1, str2, str3를 초기화 하고 있다. 


3) 포인터 기반의 문자열 배열 2


1
2
3
4
5
6
7
8
9
10
11
12

#include <stdio.h>
 
int main(void)
{
    char* stArr[3]={"Hello""Business""Pet"};
 
    int i;
    for(i=0; i<3; i++)
        printf("문자열 %d: %s \n", i+1, stArr[i]);
 
    return 0;
}
cs


1
2
3
문자열 1: Hello
문자열 2: Business
문자열 3: Pet
cs


앞서본 예제와 다른것은 5행에서 문자열을 저장할 메모리 공간을 별도로 선언 안했다.


메모리 공간에 상수의 형태로 문자열을 선언하고, 그 주소 값이 배열에 저장된다.




4) 어떤 문자열 배열을 쓸까?


총 3가지 문자열 배열 선언방식을 설명했는데,가장 보편적인 선언 방식은 2차원 배열 기반의 문


자열 배열이다. 왜냐하면 어느정도의 메모리 공간의 낭비는 있지만 선언 및 활용이 용이하다.


그러나 이정도의 메모리 낭비도 문제가 된다면 포인터 기반의 문자열 배열 2 번을 사용하자.


하지만 이 모델은 문자열이 상수의 형태로 존재하게 된다는 단점이 있다. 


결국 메모리의 효율성도 고려하고, 문자열도 변수의 행태를 취해야한다면  구현에 다소 불편함


은 있지만 포인터 기반의 문자열 배열 1번을 사용하자.

반응형