자바개발을 하다 C를 해보려 하니 포인터 개념이 생겨 생각에 정리를 할겸 혼자 되뇌이며 몇자 적어 본다.


int a, b가 있는데 값을 대입하기 위해선 a = b 이렇게 하면된다

그런데 이말인 즉 *&a = *&b 란 뜻이다

&는 주소연산자이며 포인터를 뜻하고 &a하면 int형 변수 a를 가르키는 포인터이다

한마디로 a가 어디있는지 주소를 나타내는 것이다.

*는 참조연산자로서 기억공간을 사용하기 위해 사용되고 &앞에 *& 이렇게 붙이면 당연히 &가 가르키는 주소의 값을 *이걸로 가져다 쓰겠다는 의미이다.


다시 말해서 *&a는 int형 a의 주소에 있는 값을 가져온다는 의미이다.(포인터에 참조연산자를 사용하면 포인터가 가리키는 기억공간의 저장된 값을 사용할 수 있다.)


따라서, a = *&b로도 사용할 수 있다는 말이다.


그렇다면 이러한 &(주소연산자)를 저장할 순없을까?

일반적으로 선언된 int a 와같은 변수에는 값을 저장하는 것이지 주소를 저장할 수는 없다.

하지만 참조 연산자로 변수를 선언하게 되면 이러한 주소 값을 저장할 수 있다.


int *a (포인터변수 선언) 이렇게 말이다.

저장 방법은 int a, *b;  a=10; *b=&a;  이렇게 하면된다.


포인터는 포인터가 가르키는 자료형의 크기와 관계없이 모두 4바이트이다. 따라서 포인터변수의 크기도 모두 4바이트이다.(근데 컴파일러에 따라 달라질 수 있음)

하지만 이렇게 크기가 같다고 해도 형변환이 되는것은 아니다. int형 포인터 변수에 저장된 주소를 double형 포인터 변수에 저장 못함

하지만 강제 형변환은 됨

int *ip;

double db=6.5;

ip = &db; <--하면 에러가 나지만

ip = (int *) &db <-- 이렇게 강제 형변환 하면 문제 없음


정리하자면 포인터는 주소값을 의미함 즉, 상수인 것이고

포인터 변수는 하나의 기억공간이며 번듯한 이름이 있는 변수인 거다.

포인터와 포인터 변수는 모두 특정 기억공간을 가리키는 역할을 하므로 두 가지 모두 참조 연산자를 사용하면 그들이 가리키는 기억 공간을 참조할 수 있다!

그러나 분명한 차이점은 포인터는 상수이므로 가리키는 대상을 결코 바꿀 수 없고, 포인터변수는 다른 주소값을 저장하면 얼마든지 가리키는 대상을 바꿀 수 있다.

int val;
int *ip = &val;    //포인터를 포인터변수에 저장한다
변수 val의 값 : **&ip

& : 주소연산자
val : int형 변수

&val : 포인터
ip : 포인터변수(int *)
&ip : 이중포인터
**&ip : 이중 포인터를 사용하여 변수의 값 참조
* : 참조연산자

이중포인터가 가리키는 것은 포인터변수이므로 참조 연산자를 사용하여 포인터변수에 저장된 포인터 값을 구함

이중포인터 변수
  : 이중 포인터가 가리키는 자료형을 파악한 후에 같은 자료형을 가리키는 포인터변수를 선언하면 됨

이중포인터 &ip는 (int *)형 변수의 포인터이므로 결국 이중포인터가 가리키는 자료형은 (int *)형이 될 것. 따라서 (int *)형을 가리키는 이중포인터변수 선언 가능

예)   
int **ipp;    //int*(가리키는 자료형), *(ipp는 포인터 변수임), ipp(변수의 이름)
int val = 10;    //int형 변수의 선언과 초기화
int *ip;              //포인터변수 선언
int **ipp;         //이중포인터변수 선언
ip = &val;         //int형 변수의 포인터를 포인터변수에 저장
ipp = &ip;         //포인터변수의 포인터를 이중포인터변수에 저장
printf("변수 val의 값 : %d\n", **ipp);    //참조연산자를 두 번 사용하여 참조한다.


1. 배열명을 사용한 배열 표현

   : aa[0];


2. 배열명을 사용한 포인터 표현

   : *(aa+0);


3. 배열명을 저장한 포인터 변수를 사용한 포인터 표현

   : int *ap = aa;     

     ap+0;


4. 배열명을 저장한 포인터 변수를 사용한 배열 표현

   : int *ap = aa;     

     ap[0];


* 배열요소는 참조하는 기본 방식이 포인터 계산에 의한 것이므로 계산 결과가 같다면 표현 형태는 얼마든지 바뀔 수 있음


예) *(ary) == *ary == *(ary+0)

     ary[1] == *(ary+1) == *(1+ary) == 1[ary]

+ Recent posts