happy coding

[lecture] C언어복습.포인터 본문

lecture/data structure

[lecture] C언어복습.포인터

yeoonii 2022. 12. 28. 13:19

포인터(pointer)란 주소를 가지고 있는 변수를 의미한다. 이를 이용하여 메모리의 내용에 직접 접근할 수 있다. 

변수는 메모리에 저장되고 메모리는 바이트 단위로 접근이 가능하다. 따라서 변수의 크기에 따라 차지하는 메모리 공간이 달라진다. 예를 들어 char형 변수는 1byte, int형 변수는 4byte.

여기서 변수의 주소를 계산하는 연산자는 &이다. 예시로, 변수 i의 주소는 &i 라고 말할 수 있다.

int i = 10;	// 정수형 변수 i 선언한다.
int *p = &i;	// 변수 i의 주소가 포인터 p로 대입된다.

short birthday;	
short *ptr;		//포인터가 가리키는 대상의 크기가 2바이트인 포인터 변수를 선언
ptr = &birthday;	//birthday 변수의 주소를 ptr 변수에 대입
*ptr = 1042		//ptr에 저장된 주소에 가서 값 1042대입 > birthday = 1042

간접 참조 연산자인 *는 포인터가 가리키는 값을 가져오는 연산자이다. 다시 말해 지정된 위치에서 포인터의 타입에 따라 값을 읽어 들이는 역할을 한다. (*p 라고 한다면, p가 가리키는 위치에서 4byte를 읽어온다.

이러한 포인터를 사용할 때의 주의점은 1. 포인터의 타입과 변수의 타입은 일치해야 한다. 2.초기화가 안된 포인터를 사용하면 안된다.3. 포인터가 아무것도 가리키고 있지 않는 경우에는 NULL로 초기화해야 한다, NULL 포인터를 가지고 간접 참조를 한다면 하드웨어로 감지할 수 있고 포인터의 유효성 여부 판단이 쉽다.

포인터의 증가는 일반 변수와는 약간 다르다. 가리키는 객체의 크기만큼 증가한다. 

v = *p++ p가 가리키는 값을 v에 대입한 후에 p를 증가한다.
v = (*p)++ p가 가리키는 값을 v에 대입한 후에 가리키는 값을 증가한다.
v = *++p p를 증가시킨 후에 p가 가리키는 값을 v에 대입한다.
v = ++*p p가 가리키는 값을 가져온 후에 그 값을 증가하여 v에 대입한다.

포인터를 사용해서 얻는 장점은 1. 인덱스 표기법보다 빠르다 > 원소의 주소를 계산할 필요가 없다.

C에서 인수를 전달하는 방법은 1. 값에 의한 호출 2. 참조에 의한 호출 ( 포인터 이용 ) 이 있다. 참조에 의한 호출은 함수를 호출할 때 포인터를 함수의 매개 변수로 전달하는 방법을 말한다. 다시 말해 참조에 의한 호출은 주소를 복사하는 것이다.

swap() 함수 1. 변수 2개의 값을 바꾸는 작업을 함수로 작성 2. 포인터를 이용

배열이 함수 인수이고, 배열의 크기가 큰 경우 복사하려면 많은 시간이 소모되기 때문에 배열의 주소를 전달한다. 여기서 주의할 사항, 1. 함수가 종료되더라도 남아 있는 변수의 주소를 반환해야 한다. 2. 지역 변수의 주소를 반환하면, 함수가 종료되면 사라지기 때문에 오류가 발생한다.

포인터 사용의 장점 1. 연결리스트나 이진 트리 등의 향상된 자료 구조를 만들 수 있다. 2. 참조에 의한 호출(포인터를 매개 변수로 이용하여 함수 외부의 변수의 값을 변경할 수 있다.) 3. 동적 메모리 할당 이 있다.

Comments