포인터를 사용하기 위해서 우리는 두가지 연산자를 사용한다. '*'와'&'가 그 두개다.
'*'는 포인터 변수를 선언할때도 쓰이지만 또다른 용도로도 사용한다.
- '&'의 쓰임 주소값 반환 -
int temp = 10;
int* pt1 = &temp;
printf("temp 의 주소값 : %d",&temp);
printf("pt1 의 값 : %d",pt1);
'&'는 주소값을 반환하는 용도로 쓰인다.
temp는 변수선언과 동시에 메모리상에 올라가게 되고 그와같이 주소값도 갖게 되는것이다.
예를 들어 temp의 주소값이 0x10이라면 int* pt1 = &temp; 이와같이 코드를 입력하면 temp의 주소값을 포인터pt1에 넣으라는 명령이 된다.
위의 코드에서 3,4번째 라인에 있는 결과값은 0x10되고 두개의 결과값이 동일하다는것을 알수있다.
- '*'의 쓰임 첫번째 포인터변수 선언 -
int* pt1;
char* pt2;
위와같이 사용하면 포인터변수를 선언하는것이다.
간단하게 읽어보면 int형 변수를 가르킬수있는 포인터 pt1 이렇게 읽을수있다.
char형도 읽는건 마찬가지다 하지만 여기서 포인터pt2는 char형만을 가르킬수있다.
- '*'의 쓰임 두번째 포인터가 가르키는 주소의'값' -
int temp = 10;
int* pt1 = &temp;
printf("*pt1 이 가르키는 값 : %d",*pt1);
int형 변수 temp를 상수10으로 초기화 하고 있다. 이 초기화된 값으로 포인터 pt1을 초기화 하고 있는데 포인터변수는 주소값으로 초기화 해야 하기때문에 '&'연산자를 이용해서 temp의 주소값으로 pt1을 초기화 하고있다.
printf()함수에서 포인터pt1이 가르키는 주소의 값을 출력하기 위해서 변수뒤에 '*'연산자를 붙여주고 있다 이렇게 '*'연산자는 포인터에서 두가지 용도로 쓰이는데 변수의타입을 정의하는 그러니까 int 앞에 '*'가 붙으면 포인터변수를 선언하는 것이고 변수의 타입 없이 변수뒤에 붙으면 포인터가 가르키는 값을 갖게 되는것이다.
[ 포인터와 이중포인터 예제 ]
void main(){
int temp;
int *p1; //int형을 가르킬수있는 포인터
int **pp1; //int형 의 포인터를 가르킬수있는 포인터
p1 = &temp; //temp의 주소값으로 포인터p1을 초기화
pp1 = &p1; //포인터 p1의 주소값으로 포인터 pp1을 초기화
*p1 = 10; //'*'를 뒤에 붙였으므로 p1이 가르키는 temp의 값을 직접적으로 바꿀수있다.
//즉 temp = 10; 과 동일
printf("자신들이 가리키는 값 출력\n");
printf("temp = %d\n",temp); //10출력
printf("*p1 = %d\n",*p1); //10출력
printf("*pp1 = %d\n",*pp1); //p1의 값 출력(즉 temp의 주소값)
printf("**pp1 = %d\n",**pp1); //temp의 값 10출력
//-------------------------------------
printf("자기자신의 주소값 출력\n");
printf("&temp = %d\n",&temp); //temp의 주소값 출력
printf("&p1 = %d\n",&p1);
printf("&pp1 = %d\n",&pp1);
//-------------------------------------
printf("자신들이 가르키는 주소값 출력\n");
printf("temp = %d\n",temp); //temp 는 포인터가 아니기 때문에 temp의 값을 출력시켰다.
printf("&p1 = %d\n",p1); //temp의 주소값으로 초기화를 시켜줬으므로 temp의 주소값이 출력
printf("&pp1 = %d\n",pp1); //p1의 주소값으로 초기화를 시켜줬다. p1의 주소값출력
}
- 결과 값 -
자신들이 가리키는 값 출력
temp = 10
*p1 = 10
*pp1 = 1245052
**pp1 = 10
자기자신의 주소값 출력
&temp = 1245052
&p1 = 1245048
&pp1 = 1245044
자신들이 가르키는 주소값 출력
temp = 10
&p1 = 1245052
&pp1 = 1245048
위예제를 간단히 설명하자면 아래와 같다.
포인터 pp1은 포인터p1의 주소값을 갖고 있기 때문에 포인터p1을 가르키게 되고
포인터p1은 temp의 주소값을 갖고 있으므로 temp를 가르키게 되겠죠.
[temp] <------- [*p1] <-------[**pp1]
만약 pp1 = &temp; 이렇게 &temp의 주소값을 포인터 pp1에 넣으면 에러가 발생한다.
포인터 pp1은 int형변수를 가르키는 포인터가 아니라 int형의 포인터를 가르킬수 있는 포인터이기 때문에 에러가 발생하게 되는것이다.
음... 말이 좀 어렵게 설명된거 같다...
'*'는 포인터 변수를 선언할때도 쓰이지만 또다른 용도로도 사용한다.
- '&'의 쓰임 주소값 반환 -
int temp = 10;
int* pt1 = &temp;
printf("temp 의 주소값 : %d",&temp);
printf("pt1 의 값 : %d",pt1);
'&'는 주소값을 반환하는 용도로 쓰인다.
temp는 변수선언과 동시에 메모리상에 올라가게 되고 그와같이 주소값도 갖게 되는것이다.
예를 들어 temp의 주소값이 0x10이라면 int* pt1 = &temp; 이와같이 코드를 입력하면 temp의 주소값을 포인터pt1에 넣으라는 명령이 된다.
위의 코드에서 3,4번째 라인에 있는 결과값은 0x10되고 두개의 결과값이 동일하다는것을 알수있다.
- '*'의 쓰임 첫번째 포인터변수 선언 -
int* pt1;
char* pt2;
위와같이 사용하면 포인터변수를 선언하는것이다.
간단하게 읽어보면 int형 변수를 가르킬수있는 포인터 pt1 이렇게 읽을수있다.
char형도 읽는건 마찬가지다 하지만 여기서 포인터pt2는 char형만을 가르킬수있다.
- '*'의 쓰임 두번째 포인터가 가르키는 주소의'값' -
int temp = 10;
int* pt1 = &temp;
printf("*pt1 이 가르키는 값 : %d",*pt1);
int형 변수 temp를 상수10으로 초기화 하고 있다. 이 초기화된 값으로 포인터 pt1을 초기화 하고 있는데 포인터변수는 주소값으로 초기화 해야 하기때문에 '&'연산자를 이용해서 temp의 주소값으로 pt1을 초기화 하고있다.
printf()함수에서 포인터pt1이 가르키는 주소의 값을 출력하기 위해서 변수뒤에 '*'연산자를 붙여주고 있다 이렇게 '*'연산자는 포인터에서 두가지 용도로 쓰이는데 변수의타입을 정의하는 그러니까 int 앞에 '*'가 붙으면 포인터변수를 선언하는 것이고 변수의 타입 없이 변수뒤에 붙으면 포인터가 가르키는 값을 갖게 되는것이다.
[ 포인터와 이중포인터 예제 ]
void main(){
int temp;
int *p1; //int형을 가르킬수있는 포인터
int **pp1; //int형 의 포인터를 가르킬수있는 포인터
p1 = &temp; //temp의 주소값으로 포인터p1을 초기화
pp1 = &p1; //포인터 p1의 주소값으로 포인터 pp1을 초기화
*p1 = 10; //'*'를 뒤에 붙였으므로 p1이 가르키는 temp의 값을 직접적으로 바꿀수있다.
//즉 temp = 10; 과 동일
printf("자신들이 가리키는 값 출력\n");
printf("temp = %d\n",temp); //10출력
printf("*p1 = %d\n",*p1); //10출력
printf("*pp1 = %d\n",*pp1); //p1의 값 출력(즉 temp의 주소값)
printf("**pp1 = %d\n",**pp1); //temp의 값 10출력
//-------------------------------------
printf("자기자신의 주소값 출력\n");
printf("&temp = %d\n",&temp); //temp의 주소값 출력
printf("&p1 = %d\n",&p1);
printf("&pp1 = %d\n",&pp1);
//-------------------------------------
printf("자신들이 가르키는 주소값 출력\n");
printf("temp = %d\n",temp); //temp 는 포인터가 아니기 때문에 temp의 값을 출력시켰다.
printf("&p1 = %d\n",p1); //temp의 주소값으로 초기화를 시켜줬으므로 temp의 주소값이 출력
printf("&pp1 = %d\n",pp1); //p1의 주소값으로 초기화를 시켜줬다. p1의 주소값출력
}
- 결과 값 -
자신들이 가리키는 값 출력
temp = 10
*p1 = 10
*pp1 = 1245052
**pp1 = 10
자기자신의 주소값 출력
&temp = 1245052
&p1 = 1245048
&pp1 = 1245044
자신들이 가르키는 주소값 출력
temp = 10
&p1 = 1245052
&pp1 = 1245048
위예제를 간단히 설명하자면 아래와 같다.
포인터 pp1은 포인터p1의 주소값을 갖고 있기 때문에 포인터p1을 가르키게 되고
포인터p1은 temp의 주소값을 갖고 있으므로 temp를 가르키게 되겠죠.
[temp] <------- [*p1] <-------[**pp1]
만약 pp1 = &temp; 이렇게 &temp의 주소값을 포인터 pp1에 넣으면 에러가 발생한다.
포인터 pp1은 int형변수를 가르키는 포인터가 아니라 int형의 포인터를 가르킬수 있는 포인터이기 때문에 에러가 발생하게 되는것이다.
음... 말이 좀 어렵게 설명된거 같다...