본문 바로가기
Programming/C++

C++ 포인터

by ahhang0k 2021. 4. 13.

포인터

  • 주소를 가지고 있는 변수(주소값을 저장하는 변수)
  • 포인터를 이용하여 메모리의 내용에 직접접근

 

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

  1. 포인터에 대하여 적용할 수 있는 연산에는 어떤 것들이 있는가?
  2. int형 포인터 p80번지를 가리키고 있었다면 (p+1)은 몇 번지를 가리키는가? => 84번지
  3. double형 배열을 가정하자. 2개의 double형 포인터 p, q가 있고 p가 배열의 2번째 원소를 가리키고 있고 q가 배열의 5번째 원소를 가리키고 있었다면 (q - p)는 얼마인가? => 24
  4. p가 포인터라고 하면 *p++(*p)++의 차이점은 무엇인가?
  5. 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

댓글