산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> C 언어

C++ 포인터와 배열: 관계 완벽 이해하기

C++ 포인터와 배열

이 튜토리얼에서는 예제를 통해 배열과 포인터의 관계에 대해 학습합니다.

소개

C++에서 포인터는 다른 변수의 주소를 저장하는 변수입니다. 단일 변수의 주소뿐만 아니라 배열 요소의 주소도 저장할 수 있습니다.

다음 예제를 살펴보세요:

int *ptr;
int arr[5];
// arr의 첫 번째 요소 주소를 ptr에 저장
ptr = arr;

여기서 ptr은 포인터 변수이고 arr은 int 배열입니다. ptr = arr; 코드는 배열의 첫 번째 요소 주소를 변수 ptr에 저장합니다.

arr 대신 &arr[0]을 사용하지 않은 것을 알 수 있습니다. 둘은 동일하기 때문입니다. 따라서 아래 코드도 위와 같습니다.

int *ptr;
int arr[5];
ptr = &arr[0];

나머지 배열 요소의 주소는 &arr[1], &arr[2], &arr[3], &arr[4]로 구할 수 있습니다.


모든 배열 요소 가리키기

위 예제와 같은 포인터 ptr을 사용해 배열의 네 번째 요소를 가리켜야 한다고 가정해 보겠습니다.

ptr이 첫 번째 요소를 가리키고 있다면 ptr + 3은 네 번째 요소를 가리킵니다. 예를 들어:

int *ptr;
int arr[5];
ptr = arr;
ptr + 1은 &arr[1]과 동일;
ptr + 2은 &arr[2]와 동일;
ptr + 3은 &arr[3]과 동일;
ptr + 4은 &arr[4]와 동일;

마찬가지로 단일 포인터로 요소에 접근할 수도 있습니다. 예를 들어:

// 역참조 연산자 사용
*ptr == arr[0];
*(ptr + 1)은 arr[1]과 동일;
*(ptr + 2)은 arr[2]와 동일;
*(ptr + 3)은 arr[3]과 동일;
*(ptr + 4)은 arr[4]와 동일;

ptr = &arr[2];로 초기화했다면

ptr - 2은 &arr[0]과 동일;
ptr - 1은 &arr[1]과 동일;
ptr + 1은 &arr[3]과 동일;
ptr + 2은 &arr[4]와 동일;
C++ 포인터와 배열: 관계 완벽 이해하기

참고: ptr과 ptr + 1 사이의 주소 차이는 4바이트입니다. ptr이 int 데이터를 가리키는 포인터이기 때문입니다. 64비트 운영체제에서 int의 크기는 4바이트입니다.

마찬가지로 포인터 ptr이 char 타입 데이터를 가리킨다면 ptr과 ptr + 1 사이의 주소 차이는 1바이트입니다. 문자의 크기가 1바이트이기 때문입니다.


예제 1: C++ 포인터와 배열

// 배열 각 요소의 주소를 출력하는 C++ 프로그램
#include <iostream>
using namespace std;

int main() {
    float arr[3];
    // 포인터 변수 선언
    float *ptr;

    cout << "배열을 사용한 주소 출력: " << endl;
    // for 루프로 모든 배열 요소의 주소 출력
    for (int i = 0; i < 3; ++i) {
        cout << "&arr[" << i << "] = " << &arr[i] << endl;
    }

    // ptr = &arr[0]
    ptr = arr;
    cout << "\n포인터를 사용한 주소 출력: " << endl;
    // 포인터 표기법으로 모든 배열 요소의 주소 출력
    for (int i = 0; i < 3; ++i) {
        cout << "ptr + " << i << " = " << ptr + i << endl;
    }
    return 0;
}

출력

배열을 사용한 주소 출력:
&arr[0] = 0x61fef0
&arr[1] = 0x61fef4
&arr[2] = 0x61fef8
포인터를 사용한 주소 출력:
ptr + 0 = 0x61fef0
ptr + 1 = 0x61fef4
ptr + 2 = 0x61fef8

위 프로그램에서 먼저 포인터 변수 ptr을 사용하지 않고 배열 요소들의 주소를 단순히 출력했습니다.

그런 다음 포인터 ptr을 사용해 a[0]의 주소를 가리키고, ptr + 1로 a[1]의 주소를, 이런 식으로 가리켰습니다.


대부분의 문맥에서 배열 이름은 포인터로 변환됩니다. 간단히 말해 배열 이름은 포인터로 변환됩니다. 그래서 포인터를 사용해 배열 요소에 접근할 수 있는 것입니다.

하지만 포인터와 배열은 같지 않다는 점을 기억해야 합니다.

배열 이름이 포인터로 변환되지 않는 몇 가지 경우가 있습니다. 자세한 내용은 '배열 이름이 포인터로 변환되지 않는 경우는?'을 참조하세요.


예제 2: 배열 이름을 포인터로 사용하기

// 포인터 표기법을 사용해 데이터를 입력받고 출력하는 C++ 프로그램
#include <iostream>
using namespace std;

int main() {
    float arr[5];
    // 포인터 표기법으로 데이터 입력
    cout << "5개의 숫자 입력: ";
    for (int i = 0; i < 5; ++i) {
        // 입력받은 숫자를 arr[i]에 저장
        cin >> *(arr + i);
    }
    // 포인터 표기법으로 데이터 출력
    cout << "데이터 출력: " << endl;
    for (int i = 0; i < 5; ++i) {
        // arr[i] 값 출력
        cout << *(arr + i) << endl;
    }
    return 0;
}

출력

5개의 숫자 입력: 2.5 3.5 4.5 5 2
데이터 출력:
2.5
3.5
4.5
5
2

여기서

  1. 먼저 포인터 표기법을 사용해 사용자가 입력한 숫자를 배열 arr에 저장했습니다.

    cin >> *(arr + i);

    이 코드는 아래 코드와 동일합니다:

    cin >> arr[i];

    별도의 포인터 변수를 선언하지 않고 배열 이름 arr을 포인터 표기법으로 사용했음을 알 수 있습니다.

    이미 아는 바와 같이 배열 이름 arr은 배열의 첫 번째 요소를 가리킵니다. 따라서 arr을 포인터처럼 취급할 수 있습니다.

  2. 마찬가지로 for 루프를 사용해 포인터 표기법으로 arr의 값을 출력했습니다.

    cout << *(arr + i) << endl;

    이 코드는 아래와 동일합니다:

    cout << arr[i] << endl;

C 언어

  1. C++ 변수, 리터럴, 상수 마스터하기: 종합 가이드
  2. C++ 클래스와 객체: 객체지향 프로그래밍 실전 가이드
  3. C++ 메모리 관리 마스터: new와 delete 전문가 활용법
  4. C++ 상속 접근 지정자: public, protected, private 완벽 이해
  5. C++ 프렌드 함수와 프렌드 클래스: 접근 제어 마스터하기
  6. C 포인터 마스터하기: 실전 중심 전문가 가이드
  7. C 언어에서 배열과 포인터의 관계 이해하기
  8. C 프로그래밍: 주소와 포인터를 함수에 전달하기 – 실전 가이드
  9. C 구조체와 포인터 마스터하기: 실전 가이드
  10. C++ 구조체 vs 클래스: 임베디드 개발자를 위한 실용 가이드