본문 바로가기
프로그래밍 언어/C 언어

[C] 포인터와 배열의 관계

by 까망 하르방 2021. 3. 20.
반응형

포인터와 배열의 관계

배열의 이름도 포인터 (배열의 첫번째 요소부터 가르키고 있음)
(단, 그 값을 바꿀 수 없는  상수 형태의 포인터라고 합니다.)
 
#include <stdio.h>

int main(void) {
    int arr[3] = { 0, 1, 2 };

    printf("배열의 이름: %p \n", arr);
    for (int i = 0; i < 3; i++) {
        printf("%d 번째 요소: %p \n", i, &arr[i]);
    }
}
 

※ 배열 요소가 메모리 공간에 연속적으로 할당되는 것을 확인할 수 있음 

 

arr[i] == *(arr + i)

#include <stdio.h>
int main(void) {
        int arr[3] = { 0, 1, 2 };
        int* ptr = &arr[0]; // int* ptr = arr;과 동일
        for (int i = 0; i < 3; i++) {
               printf("%d 번째 요소: %d \n", i, ptr[i]);
        }

        for (int i = 0; i < 3; i++) {
               printf("%d 번째 요소: %d \n", i, *(ptr+i));
        }
}

 

ptr은 int형 포인터 변수이기 때문에 연산시 4byte 증가하여 접근합니다.

즉, n × sizeof(int)의 크기만큼 증가합니다. 
 

일반 포인터 변수 vs 배열의 이름

포인터 변수는 주소 값의 변경이 가능하지만, 배열의 이름은 불가능합니다.
ex) char str[] = "Hello" vs char *str = "Hello"
* 큰 따옴표로 묶어서 표현되는 문자열은 그 형태에 상관없이 메모리 공간에 저장된 후 그 주소 값이 반환된다.
    그렇기 때문에 포인터 변수에 바로 값을 초기화 해주는 형태가 가능 (int형과 같은 경우 X)
배열이름 str[]은 계속 문자열 자장된 위치를 가리키는 상태이어야 하지만,
포인터 변수 *str은 다른 위치를 가리킬 수 있습니다.
But 문자열 원소 변경이 되는 것은 str[] 입니다.
#include <stdio.h>

int main(void) {
    char str1[] = "Hello";
    char* str2 = "Hello";

    // 문자열 원소 변경 시도
    str1[0] = 'C';
    str2[0] = 'C'; // 컴파일은 문제없지만, 실행 시 Error
    printf("%s %s \n", str1, str2);
}

 

※ 컴파일러 특성에 따라 연산 자체를 무시하거나, 프로그램이 바로 종료되는 경우도 있음

위처럼 값의 변경이 가능도록 선언되는 문자열을 "변수 형태의 문자열"
내용 변경이 되지 않는 *str을 "상수 형태의 문자열" 라고 합니다.
    ex) printf("Hello World")는 printf(char * str) 형태라고 볼 수 있습니다.
 
 

포인터 배열: 주소 값 저장이 가능한 배열

#include <stdio.h>
int main(void) {
        char* strArr[3] = { "Ho", "So", "Wo" };
        printf("%s %s \n", strArr[1], strArr[2]);
}
위의 형태는 main에서도 사용되는 형태입니다.
- char형 포인터 변수로 이뤄진 1차원 배열의 이름을 인자로 전달받습니다.
int main(void) {...}
int main(int argc, char* argv[])
 
반응형

'프로그래밍 언어 > C 언어' 카테고리의 다른 글

[C] 다차원 배열과 포인터 관계  (0) 2021.03.20
[C] Call-by-value & Call-by-reference  (0) 2021.03.20
[C] 동적 할당 필요성  (0) 2021.03.20
[C] [전처리기] #ifdef  (0) 2021.03.20
[C] calloc( ) & realloc( )  (0) 2021.03.20

댓글