포인터
- 주소를 가지고 있는 변수(주소값을 저장하는 변수)
- 포인터를 이용하여 메모리의 내용에 직접접근
1) 포인트 선언
ex)
int *ptr1 = &a;
ex)
int *ptr1, *ptr2;
2) 포인터 특징
- 주소는 매번 컴파일시 바뀜
- &로 주소를 확인 - 주소를 받고있는 녀석이 *이다.
- 포인터가아무것도 가리키고 있지 않은 경우에는 NULL로 초기화
- 포인터의 타입과 변수의 타입은 일치하여야 한다.
- 초기화가 안된 포인터를 사용하면 안된다.
ex) *p와 p 차이점 이해하기
#include <iostream>
using namespace std;
int main() {
int i = 10;
int* p = &i;
cout << "i : " << i << endl;
cout << "&i : " << &i << endl;
cout << "p : " << p << endl;
cout << "*p : " << *p << endl;
*p = 20;
cout << "i : " << i << endl;
cout << "&i : " << &i << endl;
cout << "p : " << p << endl;
cout << "*p : " << *p << endl;
return 0;
}
3) 간접참조로 1증가 시키기
가능한 연산: 증가, 감소, 덧셈, 뺄셈 연산
#include <iostream>
using namespace std;
int main()
{
char c = 'A';
int i = 100000;
double d = 6.78;
char* pc = &c;
int* pi = &i;
double* pd = &d;
(*pc)++; //간접참조로 1증가
*pi = *pi + 1; //간접참조로 1증가
*pd += 1; //간접참조로 1증가
cout << c << endl;
cout << i << endl;
cout << d << endl;
return 0;
}
4) 번지 증가시키기
증가 연산의 경우 증가되는 값은 포인터가 가리키는 객체의 크기
#include <iostream>
using namespace std;
int main() {
char* pc;
int* pi;
double* pd;
pc = (char*)10000;
pi = (int*)10000;
pd = (double*)10000;
cout << "증가 전 pc = " << (void*)pc << " pi= " << pi << " pd= " << pd << endl;
pc++;
pi++;
pd++;
cout << "증가 후 pc = " << (void*)pc << " pi= " << pi << " pd= " << pd << endl;
return 0;
}
5) 포인터와 배열
- C++에서는 배열의 이름을 포인터처럼 사용할 수 있을 뿐만 아니라, 포인터를 배열의 이름처럼 사용할 수도 있다.
- 즉, C++에서는 배열의 이름이 주소로 해석되며, 해당 배열의 첫 번째 요소의 주소와 같게 됩니다.
- 배열에 관계된 연산을 할 때는 언제나 배열의 크기를 넘어서는 접근을 하지 않도록 주의해야 합니다. 포인터 연산을 이용하여 계산하다가 배열의 크기를 넘어서는 접근을 하는 경우, C++ 컴파일러는 어떠한 오류도 발생시키지 않습니다. 다만 잘못된 결과만을 반환하므로 C++로 프로그래밍할 때에는 언제나 배열의 크기에 주의해야 합니다.
- 장점 : 인덱스 표기법 보다 빠르다 => 원소의 주소를 계산할 필요가 없다.
#include <iostream>
using namespace std;
int main() {
int a[] = { 10,20,30,40,50 };
cout << "&a[0] = " << &a[0] << endl;
cout << "&a[1] = " << &a[1] << endl;
cout << "&a[2] = " << &a[2] << endl;
cout << "a = " << a << endl;
return 0;
}
ex) 입력한 값을 더하는 포인터 배열
#include <iostream>
using namespace std;
int get_sum2(int a[], int n);
//main()에서 5개의 정수값을 입력받아 배열을 초기화하고
//min array함수를 호출해라
int main() {
const int SIZE = 5;
int arr[5];
for(int i=0; i < SIZE; i++){
cout << "값을 입력해 주세요: ";
cin >> arr[i];
}
int sum = get_sum2(arr,SIZE);
cout << "모든 값을 합한 값은 : "<< sum;
return 0;
}
int get_sum2(int a[], int n)
{
int i;
int *p;
int sum = 0;
p = a;
for(i = 0; i < n; i++ )
sum += *p++;
return sum;
}
Quiz
- 포인터에 대하여 적용할 수 있는 연산에는 어떤 것들이 있는가?
- int형 포인터 p가 80번지를 가리키고 있었다면 (p+1)은 몇 번지를 가리키는가? => 84번지
- double형 배열을 가정하자. 2개의 double형 포인터 p, q가 있고 p가 배열의 2번째 원소를 가리키고 있고 q가 배열의 5번째 원소를 가리키고 있었다면 (q - p)는 얼마인가? => 24
- p가 포인터라고 하면 *p++와 (*p)++의 차이점은 무엇인가?
- p가 포인터라고 하면 *(p+3)의 의미는 무엇인가? => p의 주소에서 3번지를 더한값으로 가서 가리키는 값
'Programming > C++' 카테고리의 다른 글
C++ 문자열 배열 실습문제 (0) | 2021.04.15 |
---|---|
C++ 포인터 배열 실습문제 (0) | 2021.04.15 |
C++ 실습 0413 (0) | 2021.04.13 |
C++ 실습 배열 6문제 0412 (0) | 2021.04.12 |
C++ 배열 (0) | 2021.04.12 |
댓글