일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Data Science
- 문자열
- Object Oriented Programming
- 티스토리챌린지
- OOP
- 함수
- pointer
- Class
- 백준
- programming
- Deep Learning
- baekjoon
- assignment operator
- raw data
- vscode
- 오블완
- 배열
- function
- const
- pass by reference
- array
- 반복문
- C++
- 포인터
- 알고리즘
- predictive analysis
- Python
- 파이썬
- string
- Pre-processing
- Today
- Total
Channi Studies
[C++] 포인터 연산/산술 (Pointer Arithmetic) 본문
C++의 포인터는
- Assignment Expressions (대입 표현식)
- Arithmetic Expressions (산술 표현식)
- Comparison Expressions (비교 표현식)
에서 사용이 가능합니다.
포인터에 대한 다양한 연산(산술)이 가능합니다.
다음은 포인터에 적용 가능한 몇가지 연산들입니다.
- (++)
포인터의 값을 증가시켜 배열의 다음 요소를 가르키도록 합니다.
int_ptr++; - (--)
포인터의 값을 감소시켜 배열의 이전 요소를 가르키도록 합니다.
int_ptr--; - (+)
포인터의 값을 n * sizeof(type) 만큼 증가시킵니다.
int_ptr += n; or int_ptr = int_ptr + n; - (-)
포인터의 값을 n * sizeof(type) 만큼 감소시킵니다.
int_ptr -= n; or int_ptr = int_ptr - n;
그렇다면 만약에,
두 포인터 끼리 뺄셈(-)을 하면 어떻게 될까요?
그렇게 하면, 두 포인터 사이에 존재하는 요소의 숫자를 알 수 있습니다.
다만, 계산에 사용되는 두 포인터의 타입은 무조건 동일해야합니다.
int n = int_ptr2 - int_ptr1;
과연 포인터끼리 비교를 하면 어떻게 될까요? (==), (!=)
두 포인터의 값, 즉 해당 포인터들이 각각 가리키는 위치가 동일한지를 알 수 있습니다.
중요한점은 그들이 각각 'pointing 하는 위치에 저장된 데이터'는 비교하지 않습니다.
다른 위치에도 똑같은 값이 저장되어 있을 수 있잖아요?
그건 상관이 없다는 뜻입니다.
string s1{"hello"};
string s2{"hello"};
string ptr1 {&s1};
string ptr2 {&s2};
string ptr3 {&s3};
cout << (ptr1 == ptr2) << endl; // false
cout << (ptr1 == ptr3) << endl; // true
cout << (*ptr1 == *ptr2) << endl; // true
cout << (*ptr1 == *ptr3) << endl; // true
매우 직관적이죠?
마지막으로 포인터 연산에 관련된 한가지 간단하지만 자주 사용되는 표현을 알려드리겠습니다.
int scores[] {100, 90, 80, 70, -1};
int *score_ptr {scores};
while (*score_ptr != -1){
cout << *score_ptr << endl;
score_ptr++;
}
scores 배열과 그에 해당하는 score_ptr를 선언했습니다.
그리고 *score_ptr, 즉 score_ptr가 나타내는 주소에 있는 값이 -1이 아닐 때,
score_ptr의 첫번째 값을 출력 하고,
score_ptr++를 해서 (메모리 주소로 치면 +4 겠지요?)
배열의 다음 요소를 출력하는 반복문입니다.
이 while문 내부의 줄을 한 줄로 줄일 수 있고, 이는 매우 자주 사용되는 표현입니다.
int scores[] {100, 90, 80, 70, -1};
int *score_ptr {scores};
while (*score_ptr != -1){
cout << *score_ptr++ << endl;
}
*score_ptr 로 역참조(dereference)를 한 뒤, 증가 연산자로 1을 증가시켰습니다.
간단하지만 동일한 기능을 하고 있죠?
이후에 포인터와 배열과 관련된 프로그램에서 유용하게 사용될 수 있는 표현입니다.
'C++ > 포인터 (Pointers)' 카테고리의 다른 글
[C++] 상수의 포인터 (Pointers to Constants) (0) | 2023.12.22 |
---|---|
[C++] 배열과 포인터의 관계 (Relationship Between Arrays and Pointers) (1) | 2023.12.19 |
[C++] 동적 메모리 할당 (Dynamic Memory Allocation) (1) | 2023.12.19 |
[C++] 역참조 (Dereferencing a Pointer) (0) | 2023.12.19 |
[C++] 데이터의 주소에 접근하는 방법 (1) | 2023.12.19 |