C : Pointers and Array

m_ngyeong·2024년 10월 15일
0

C

목록 보기
8/16
post-thumbnail

Pointers and Array


Array of Pointers(포인터 배열)

포인터 배열은 배열의 요소가 포인터인 배열이다. 배열의 각 요소가 메모리 주소(다른 변수의 주소)를 저장하는 포인터이다. 쉽게 말해, 포인터 배열은 주소값들을 저장하는 배열을 말한다.

선언 방법:

int *arr[5];
  • arr는 크기가 5인 포인터 배열.
    arr는 5개의 포인터를 저장할 수 있으며, 각 포인터는 int형 변수를 가리킴.

예시:

int a = 10, b = 20, c = 30;
int *arr[3];  // 포인터 배열 선언

arr[0] = &a;
arr[1] = &b;
arr[2] = &c;

for (int i = 0; i < 3; i++) {
    printf("arr[%d]가 가리키는 값: %d\n", i, *arr[i]);
}


// 출력
arr[0]가 가리키는 값: 10
arr[1]가 가리키는 값: 20
arr[2]가 가리키는 값: 30
  • arr[0], arr[1], arr[2]는 각각 a, b, c의 주소를 가리키는 포인터.
  • *arr[i]로 배열 요소가 가리키는 값을 출력할 수 있음.

포인터 배열의 주소값 비교

#include <stdio.h>

int main() {
    int a = 5, b = 10;
    int *array1[2] = { &a, &b };
    int *array2[2] = { &a, &b };
    int *array3[2] = { &b, &a };

    // 포인터 배열의 주소값 비교
    if (array1[0] == array2[0] && array1[1] == array2[1]) {
        printf("array1 and array2 point to the same addresses.\n");
    } else {
        printf("array1 and array2 point to different addresses.\n");
    }

    if (array1[0] == array3[0] && array1[1] == array3[1]) {
        printf("array1 and array3 point to the same addresses.\n");
    } else {
        printf("array1 and array3 point to different addresses.\n");
    }

    return 0;
}
  • array1array2는 동일한 주소값을 저장하고 있으므로 array1[0] == array2[0] && array1[1] == array2[1]는 참(True).
  • array1array3는 다른 순서로 주소값을 저장하고 있으므로 array1[0] == array3[0] && array1[1] == array3[1]는 거짓(False).

포인터 배열을 비교할 때는 실제로 포인터가 가리키는 주소값을 비교하는 것이지, 그 주소에 저장된 값을 비교하는 것이 아닙니다. 포인터가 가리키는 값 자체를 비교하려면 다음과 같이 역참조 연산자 *를 사용해야 한다:

if (*array1[0] == *array2[0] && *array1[1] == *array2[1]) {
    printf("Values pointed to by array1 and array2 are the same.\n");
} else {
    printf("Values pointed to by array1 and array2 are different.\n");
}

Pointer to an Array(배열 포인터)

배열 포인터는 배열 자체를 가리키는 포인터이다. 즉, 포인터가 배열 전체를 가리키며, 이 포인터를 통해 배열에 접근할 수 있다. 배열 포인터는 배열의 시작 주소값을 저장할 수 있다.

선언 방법:

int int (*ptr)[5];
  • ptr는 크기가 5인 정수로 이루어진 배열을 가리키는 포인터.
    ptr는 배열의 시작 주소를 저장하며, 배열의 첫 번째 요소뿐만 아니라 전체 배열을 가리킴.

예시:

int arr[5] = {1, 2, 3, 4, 5};
int (*ptr)[5] = &arr;  // 배열 포인터 선언 및 초기화

for (int i = 0; i < 5; i++) {
    printf("arr[%d]의 값: %d\n", i, (*ptr)[i]);
}

출력:

arr[0]의 값: 1
arr[1]의 값: 2
arr[2]의 값: 3
arr[3]의 값: 4
arr[4]의 값: 5
  • 여기서 ptr은 배열 arr의 시작 주소를 가리키고 있으며, (*ptr)[i]를 통해 배열의 각 요소에 접근할 수 있음.
  • *ptr은 배열 자체를 나타내므로, 배열처럼 인덱스를 사용하여 배열 요소를 접근할 수 있음.

포인터 배열과 배열 포인터의 차이점

구분포인터 배열 (Array of Pointers)배열 포인터 (Pointer to an Array)
정의포인터들을 요소로 가지는 배열배열 전체를 가리키는 포인터
메모리 구조각 배열 요소는 다른 메모리 위치를 가리킬 수 있는 포인터를 저장배열의 시작 주소를 가리키며 배열 내 모든 요소가 연속된 메모리에 있음
선언 방법int *arr[5]; (포인터 5개를 저장하는 배열)

int (*ptr)[5]; (5개의 정수 배열을 가리키는 포인터)
|사용 예|여러 변수를 가리키는 포인터들을 저장하고 관리하는 데 사용| 다차원 배열을 처리하거나 함수의 매개변수로 배열을 전달할 때 사용|

포인터 배열:

int *arr[3];  // 3개의 포인터를 저장하는 배열

배열 포인터:

int (*ptr)[3];  // 크기가 3인 배열을 가리키는 포인터

포인터 배열은 다양한 주소를 관리할 수 있고, 배열 포인터는 배열을 한 번에 처리할 수 있는 방법을 제공한다.



profile
사용자 경험 향상과 지속적인 성장을 추구하는 프론트엔드 개발자 ʚȉɞ

0개의 댓글