<포인터 개요>
1. 포인터를 이용하게 되면 기계어나 어셈블리 언어처럼 메모리의 주소를 이용해 메모리의 내용을 직접 접근할 수 있음
2. 포인터가 사용되는 경우
- call by reference로 함수로부터 한 개 이상의 값을 리턴할 때
- 함수들 간에 배열이나 문자열을 전달할 때
- 배열 조작을 쉽게 할 때
- 연결 리스트(linked list)나 이진 트리(binary tree) 등 복잡한 자료 구조를 만들 때
- 메모리를 동적으로 할당할 때
<포인터와 주소>
int sum=0; 변수를 초기화하면서 선언하면, int형이므로 4바이트 메모리 공간이 확보되고 초기값으로 0이 할당됨 sum변수가 실제로 할당된 메모리의 주소를 알고 싶다면 &연산자를 사용하여 &sum이라고 하면 변수가 기억되어 있는 메모리 번지를 알 수 있음
1. 메모리에는 위치를 구분하기 위해 순서대로 번호가 붙어있는데 이것을 메모리의 주소, 번지, address라 함
2. 메모리의 주소를 저장하려면 일반 변수가 아닌 포인터를 사용
3. 포인터라고만 해도 되지만 주소를 저장하는 변수이므로 포인터 변수라고도 함
<포인터 선언>
1. 포인터도 변수이므로 사용하기 전에 선언해야 함
2. 자료형과 변수명 사이에 구두점 를 더 쓰면 됨
3. 선언문에서 쓰는 는 곱하기 연산자와 전혀 관계없는 구두점
4. *는 자료형과 변수명 사이 아무데나 있어도 됨int x; //일반 변수 x의 선언 int *x; //포인터 (변수) x의 선언 int* px; //포인터 px의 선언 int *px, y; //px만 포인터, y는 일반 변수 int *px, *py; //px, py 둘 다 포인터
<참조 연산자 *>
1. 포인터에 주소를 대입하는 방법int x=10 ; //일반 변수 x의 선언과 초기화 px=&x; //포인터 px에 변수 x의 주소 대입
- 포인터는 일반적으로 일반 변수명 앞에 주소 연산자(&)를 사용해 해당 변수의 주소를 저장
- 포인터 px에는 변수 x의 주소가 들어있음
- px가 저장하고 있는 x의 주소로 가서 그 값인 10을 변수 y에 대입하려면 다음과 같이 하면 됨
y=*px;
- 포인터 앞에 를 찍어주면 되는데 이때 는 참조 연산자
- 곱하기 연산자 *와 모양은 같지만 우선 순위가 높음
<* : 선언문(구두점) vs. 실행문(연산자)>
1. 선언문: 포인터를 선언(구두점)할 때
2. 실행문: 주소로 가서 값을 가져올 때(연산자)
3. *이 선언문에서 사용되는지 실행문에서 사용되는지에 따라서 다름int x=10,y; // 정수형 변수 x,y선언 int *px; // 포인터 px선언, 선언문에서 *는 포인터를 선언하는 구두점 px=&x; // 정수형 변수 x의 주소를 포인터 px에 대입 y=*px; // px가 저장하고 있는 주소로 가서 값을 가져옴 // 실행문에서 *는 참조 연산자
<포인터(변수)의 크기, 선언, 간접 값 참조>
#include <iostream> int main(void) { int x = 10, y; int* px; // 선언문, 포인터 px선언 px = &x; // 포인터 px에 x의 주소 대입 y = *px; // 실행문, px의 주소로 가서 값을 가져옴 std::cout << x << " " << &x << std::endl; std::cout << sizeof(x) << " " << sizeof(&x) << std::endl; std::cout << px << " " << &px << " " << *px << std::endl; std::cout << y << " " << &y; return 0; }
<포인트 변수의 자료형>
1. 자료형 포인터변수명;
int pi;
○변수 pi가 int형 데이터를 참조하기 위한 포인터 변수
○pi가 지시하는 곳의 자료형이 int형
char *pc;
○변수 pc가 char형 데이터를 참조하기 위한 포인터 변수
○pc가 지시하는 곳의 자료형이 char형
<포인터의 초기화>
1. 자료형 *포인터_변수명=초기화 주소;int x=10; int *px=&x; int *px=1000;
<포인터의 선언과 간접 값 참조>
#include <iostream> int main(void) { int* pi; //정수형 포인터 pi char* pc; //문자형 포인터 pc double* pd; //배정도형 포인터 pd std::cout<<sizeof(pi)<<" "<<sizeof(pc)<<" "<<sizeof(pd)<<std::endl; std::cout << sizeof(*pi) << " " << sizeof(*pc) << " " << sizeof(*pd); return 0; }
<포인터 연산>
#include <iostream> int main(void) { char c; int i; double d; char* pc = &c; int* pi = &i; double* pd = &d; std::cout << (void*) pc << " " << (void*)(pc + 1) << std::endl; std::cout << pi << " " << pi + 1 << std::endl; std::cout << pd << " " << pd + 1 << std::endl; return 0; }
<x[i]와 *(x+i)>
#include <iostream> int main(void) { int x[5] = { 10,20,30,40,50 }; int i; std::cout <<"x=" << x <<std::endl; for(i = 0; i < 5; i++) std::cout<< &x[i]<<"="<< x[i]<<", "<< x+i <<"="<< *(x+i)<<std::endl; return 0; } //&x[0]=x[0], x+0=*(x+0)
<x[1] == 1[x]>
#include <iostream> int main(void) { int x[5] = { 10,20,30,40,50 }; std::cout<< x <<":" << *x << x[0] << 0[x] << std::endl; std::cout<< x+0 <<":" << *(x+0) << *(0+x) << x[0] << 0[x] << std::endl; std::cout<< x+1 <<":" << *(x+1) << *(1+x) << x[1] << 1[x] << std::endl; return 0; }