내용 출처 : YES C (정보공학연구소 /생능출판사)
혼자 연구하는 C/C++ (SoEn.kr /와우북스)
Ⅰ. T형 포인터의 정의
① T형 포인터는 'T형 변수가 저장된 메모리의 시작 주소를 저장하는 자료형'이다.
② 임의의 T형 변수가 있다면 언제나 T형 포인터 변수도 선언할 수 있다.
③ T형 포인터 Tp를 선언하는 문법은 예시와 같다.
ex) ⑴ T* tp, ⑵ T *tp, ⑶ T * tp, ⑷ T*tp
④ ⑴은 T* 자체가 하나의 자료형이라는 관점에서 주로 쓰고, ⑵는 *tp가 포인터형 변수임을 강조할 때 주로 쓴다.
⑤ 하지만 T* tp1, tp2 로 쓴다면 tp1은 T형 포인터 변수로 선언되지만, tp2는 그냥 T형 변수로 선언된다.
⑥ 즉, 컴파일러가 T*를 하나의 자료형으로 해석하지는 않는다.
⑦ tp1과 tp2를 모두 포인터형 변수로 선언하고 싶다면 T* tp1, *tp2 식으로 tp2 앞에도 *를 붙여줘야 한다.
Ⅱ. 포인터 연산자 '&'과 '*'
① C언어에서는 데이터형 변수와 포인터형 변수를 완전히 구분하기 때문에 일반 변수를 그대로 포인터형 변수에 배정할 수 없다.
② 이를 해결하기 위해서 C언어는 포인터 연산자를 사용한다.
③ '&'은 데이터형 변수 앞에 붙여서 그 변수의 메모리 주소를 나타낸다. ex) int i 의 메모리 주소는 &i 로 나타낸다.
④ '*'은 포인터형 변수 앞에 붙여서 그 주소에 들어있는 값을 나타낸다. ex) int* ip = &i 일때 변수 *ip의 값은 변수 i의 값과 같다.
Ⅲ. 포인터의 타입
① 32비트 환경에서 모든 메모리의 주소는 4바이트로 이루어져 있으므로 모든 포인터형 변수의 크기는 4바이트이다.
② 하지만 int* ip와 char* cp는 서로 호환되지 않는다.
③ 왜냐하면 int* ip와 char* cp는 각 주소의 위치의 값을 해석하는 방법이 다르기 때문이다.
Ⅳ. 포인터의 가감연산
① 포인터형 변수는 정수형과의 가감산 연산이 가능하다.
② 이러한 연산은 배열과 같이 메모리가 서로 인접한 경우에 주로 사용된다.
③ T* tp에 정수 i를 더하면 tp=tp+(i*sizeof(T))가 된다.
④ T가 배열이라면 T* tp에 대한 tp+i는 배열의 다음 i번째 요소로 이동하라는 것과 같다.
Ⅴ. 포인터끼리의 연산
① 포인터끼리는 더할 수 없다.
② 포인터끼리 뺄 수는 있다. 이는 두 주소간의 상대적인 거리를 의미한다. 이 값은 더 이상 주소값이 아니며 정수값이다.
③ 포인터에 정수를 더하거나 뺄 수 있다.
④ 포인터와 실수간의 연산은 허용되지 않는다.
⑤ 포인터에 대한 곱셈이나 나눗셈은 허용되지 않는다.
⑥ 두 포인터의 타입이 같을 때 서로 대입할 수 있다.
⑦ 포인터끼리의 비교 연산은 잘 사용되진 않지만 가능하다. 주로 포인터값의 유효성을 점검하기 위해서 NULL값과 비교하는 연산을 많이 쓴다.
Ⅵ. 포인터에 값을 배정하는 예들
① 배열의 주소를 배정 ex)char a[50]; char *p; p = a;
② 배열의 한 원소 주소를 &연산자로 배정 ex) char a[50]; char *p; p = &a[3];
③ char형 포인터에 문자열 시작 주소 배정 // vs2017기준 C++환경에서는 안됨.
④ 포인터에 NULL을 배정 ex) FILE *fp; if(fp = fopen("mypile.d","r") == NULL);
⑤ 프로그램 실행 전, 동적 기억 장소를 확보하고 시작 부분 주소 배정 ex) char *p; p = (char *)malloc(124);
//동적할당은 다음 장에서 자세하게 나오는듯하다.
/*
포인터에 대한 내용들은 soen.kr에 훨씬 자세한 설명들이 많이 있으므로 참조하자.
블로그에는 책의 순서를 기준으로 간략한 내용만 적었다.
*/