<포인터 개요>
1. 포인터를 이용하게 되면 기계어나 어셈블리 언어처럼 메모리의 주소를 이용해 메모리의 내용을 직접 접근할 수 있음
2. 포인터가 사용되는 경우

  • call by reference로 함수로부터 한 개 이상의 값을 리턴할 때
  • 함수들 간에 배열이나 문자열을 전달할 때
  • 배열 조작을 쉽게 할 때
  • 연결 리스트(linked list)나 이진 트리(binary tree) 등 복잡한 자료 구조를 만들 때
  • 메모리를 동적으로 할당할 때

<포인터와 주소>
1. 메모리에는 위치를 구분하기 위해 순서대로 번호가 붙어있는데 이것을 메모리의 주소, 번지, address라 함
2. 메모리의 주소를 저장하려면 일반 변수가 아닌 포인터를 사용
3. 포인터라고만 해도 되지만 주소를 저장하는 변수이므로 포인터 변수라고도 함

int sum=0; 변수를 초기화하면서 선언하면, int형이므로 4바이트 메모리 공간이 확보되고 초기값으로 0이 할당됨 sum변수가 실제로 할당된 메모리의 주소를 알고 싶다면 &연산자를 사용하여 &sum이라고 하면 변수가 기억되어 있는 메모리 번지를 알 수 있음

<포인터 선언>
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의 주소 대입
  1. 포인터는 일반적으로 일반 변수명 앞에 주소 연산자(&)를 사용해 해당 변수의 주소를 저장
  2. 포인터 px에는 변수 x의 주소가 들어있음
  3. px가 저장하고 있는 x의 주소로 가서 그 값인 10을 변수 y에 대입하려면 다음과 같이 하면 됨
y=*px;
  1. 포인터 앞에 를 찍어주면 되는데 이때 는 참조 연산자
  2. 곱하기 연산자 *와 모양은 같지만 우선 순위가 높음

<* : 선언문(구두점) 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;
}
profile
개발 초보 대학생

0개의 댓글