일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 오블완
- 문자열
- 백준
- Pre-processing
- 파이썬
- OOP
- baekjoon
- 반복문
- function
- predictive analysis
- Python
- raw data
- 함수
- pointer
- string
- programming
- 알고리즘
- C++
- pass by reference
- array
- const
- Class
- 배열
- vscode
- Deep Learning
- 포인터
- 티스토리챌린지
- Object Oriented Programming
- assignment operator
- Data Science
- Today
- Total
Channi Studies
[C++] 배열과 포인터의 관계 (Relationship Between Arrays and Pointers) 본문
[C++] 배열과 포인터의 관계 (Relationship Between Arrays and Pointers)
Chan Lee 2023. 12. 19. 22:59배열과 포인터의 관계: Relationship Between Arrays and Pointers
배열과 포인터를 둘 다 얼추 이해하게 되면, 한가지 공통점을 알게 됩니다.
배열의 이름이 어떤 것을 의미하는지 기억하고 계시나요?
바로 '배열의 첫번째 데이터의 주소값'을 나타냅니다.
그리고, 포인터 변수의 값은 주소값이였습니다.
이렇게 보면 사실상 배열의 이름과 포인터는 동일한 것 같지 않나요?
실제로 만약 포인터가 배열의 요소와 동일한 타입을 가지고 있다면,
포인터와 배열은 상호교환적으로, (사실상) 동일하게 사용할 수 있습니다.
간단한 코드로 이를 확인해 보겠습니다.
int scores[]{100, 90, 80};
cout << "Print scores: " << scores << endl; // 0x16f11b138 (주소)
cout << "Print *scores: " << *scores << endl; // 100
int *score_ptr{scores};
cout << "Print score_ptr: " << score_ptr << endl; // 0x16f11b138 (주소)
cout << "Print *score_ptr: " << *score_ptr << endl; // 100
배열의 이름 scores와 score_ptr 포인터가 동일한 기능을 수행하고 있음을 알 수 있습니다.
각 요소에도 동일한 방법으로 접근할 수 있는지 확인해볼까요?
int scores[]{100, 90, 80};
int *score_ptr{scores};
cout << score_ptr[0] << endl; // 100
cout << scores[0] << endl; // 100
cout << score_ptr[1] << endl; // 90
cout << scores[1] << endl; // 90
cout << score_ptr[2] << endl; // 80
cout << scores[2] << endl; // 80
정확하게 동일한 방법으로 할 수 있었습니다.
cout << *score_ptr << endl; // 100
cout << *(score_ptr + 1) << endl; // 90
cout << *(score_ptr + 2) << endl; // 80
이런 것도 가능합니다.
이게 어떻게 가능한지는 제 포스트 중 배열에 관련된 포스트에서 대략 소개가 되어있습니다.
[C++] 배열 (Array)
Modern C++에서는 주로 배열보다는 벡터를 사용합니다. 배열에는 여러가지 특징이 존재합니다. 대표적인 특징 여러가지를 소개해드리겠습니다. 1. 배열의 모든 요소들은 같은 데이터 타입이여야
code-studies.tistory.com
미리보기 사진이 관련된 설명 부분입니다.
sizeof(int) = 4 이므로, 정수 배열의 각 요소인 정수 하나 당 4의 바이트를 차지합니다.
위의 예시에서도 같은 개념이 적용되었습니다.
*score_ptr = score_ptr 의 주소 = scores 배열의 첫번째 값 (100) 의 주소 입니다.
이를 0x16...10 이라고 가정했을 때,
*(score_ptr + 1) = 0x16...10 + 4 = 0x...14
*(score_ptr + 2) = 0x16...10 + 4 + 4 = 0x...18
*(score_ptr + 3) = 0x16...10 + 4 + 4 + 4 = 0x...22
...
이런 식으로 진행됩니다.
asterisk를 떼고 직접적으로 주소를 한번 읽어볼까요?
int scores[]{100, 90, 80, 70};
int *score_ptr{scores};
cout << score_ptr << endl; // 0x16b00f130
cout << (score_ptr + 1) << endl; // 0x16b00f134
cout << (score_ptr + 2) << endl; // 0x16b00f138
0x16...30, 0x16...34, 0x16...38
로 4씩 증가하는게 보이실 겁니다.
즉, 하나의 표현으로 정리하자면
array_name 배열과 그 배열을 가르키는 pointer_name 포인터에 대해서,
array_name[index] = *(array_name + index)
pointer_name[index] = *(pointer_name + index)
입니다.
'C++ > 포인터 (Pointers)' 카테고리의 다른 글
[C++] 상수의 포인터 (Pointers to Constants) (0) | 2023.12.22 |
---|---|
[C++] 포인터 연산/산술 (Pointer Arithmetic) (0) | 2023.12.19 |
[C++] 동적 메모리 할당 (Dynamic Memory Allocation) (1) | 2023.12.19 |
[C++] 역참조 (Dereferencing a Pointer) (0) | 2023.12.19 |
[C++] 데이터의 주소에 접근하는 방법 (1) | 2023.12.19 |