본문 바로가기
정글

TIL(16일차) 포인터 디테일

by 진득한진드기 2023. 5. 7.

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