연재 완료/C Lang 이론

C언어 이론 8. 포인터 (포인터의 정의와 연산)

라이피 (Lypi) 2018. 5. 23. 15:53
반응형

내용 출처 : 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에 훨씬 자세한 설명들이 많이 있으므로 참조하자.

블로그에는 책의 순서를 기준으로 간략한 내용만 적었다.

*/



반응형