RB 트리 관련 주차인데
기존의 배웠던 포인터에 대해서 다시 보았다.
막상 배웠었으니까 쉽겠지~ 라고 생각했다가 큰 코 다쳐버렸다...ㅋㅋㅋ
개념은 알고 있다고 해도 디테일을 살리는게 굉장히 어렵다는 것을 깨달았다.
포인터의 세계는 너무 방대 한것 같다....
#include <stdio.h>
#include <stdlib.h>
int main() {
int i = 1;
int *pint = &i;
printf("*pint\n");
printf("pint = %p\n",pint);
printf("i = %d\n",i);
printf("*pint = %d\n\n",*pint);
# 주소의 값을 올려준다.
*(pint++);
printf("*(pint)++\n");
printf("pint = %p\n",pint);
printf("i = %d\n",i);
printf("*pint = %d\n\n",*pint);
# 참조하는 값을 올려준다.
++*pint;
printf("++*pint\n");
printf("pint = %p\n",pint);
printf("i = %d\n",i);
printf("*pint = %d\n\n",*pint);
# 참조하는 값을 올려준다.
++*pint;
printf("++*pint\n");
printf("pint = %p\n",pint);
printf("i = %d\n",i);
printf("*pint = %d\n\n",*pint);
#주소의 값을 올려준다.
*pint++;
printf("*pint++\n");
printf("pint = %p\n",pint);
printf("i = %d\n",i);
printf("*pint = %d\n\n",*pint);
# 주소의 값을 올려준다.
*(pint++);
printf("*(pint)++\n");
printf("pint = %p\n",pint);
printf("i = %d\n",i);
printf("*pint = %d\n\n",*pint);
# 참조하는 값을 올려준다.
(*pint)++;
printf("*(pint)++\n");
printf("pint = %p\n",pint);
printf("i = %d\n",i);
printf("*pint = %d\n\n",*pint);
return 0;
}
결과는 아래와 같다.
주소의 값을 ++ 하고 나서는 가르키는 값이 이상해진다.
쓰레기 값을 참조하게 되므로 어떠한 값이 올지 예상이 불가능해진다.
이중 포인터의 이해를 하기 위해 아래와 같은 코드를 짰다.
#include <stdio.h>
#include <stdlib.h>
int main() {
char *str = (char *)malloc(sizeof(char) * 20);
str[0] = 'a';
str[1] = 'b';
str[2] = '\n';
// 포인터 형인 str의 주소를 가르키기 위한 ptr 포인터(이중포인터)
void** ptr = (void **)&str;
char* name = (char*) *ptr;
// %s는 주소의 접근하여 '\0'이 오기전까지 출력한다.
printf("%s", name);
int64_t a = 6;
int64_t *pa = &a;
// ptr2는 a의 주소를 가르키는 pa의 주소를 가르킴(이중포인터)
void** ptr2 = (void **)&pa;
// 그 ptr2을 참조하면 a의 주소가 나옴
int64_t* number = (int64_t*) *ptr2;
// a의 주소를 가르키는 number를 참조하면 6이 출력됨
printf("%ld\n", *number);
return 0;
}
결과는 아래와 같다.
'정글' 카테고리의 다른 글
TIL(18일차) RB트리 삭제 (0) | 2023.05.10 |
---|---|
TIL(17일차) 레드블랙트리 삽입 (0) | 2023.05.08 |
TIL(15일차) 링커 (0) | 2023.05.06 |
TIL(14일차) 메모리누수 (0) | 2023.05.05 |
TIL(13일차) re : 프로시저 (0) | 2023.05.04 |