ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 포인터란?(정적할당, 동적할당)
    개발/알아둘 기본 개념 2023. 9. 26. 13:56
    728x90

     

    변수의 주소값을 저장하는 변수라고 할 수 있다. 아래의 그림(?)을 참고해보자.

     

    개념정리

     

    int *ip;  포인터 변수를 선언할 때 사용하는 *를 사용하여 포인터변수 ip를 생성한다.

    그리고 변수 k를 생성한다.

     

    포인터변수 ip는 본인의 주소를 갖고있고, 다른 변수의 주소를 가질 수 있다.

    ip = &k;  &기호를 사용하여 k에 주소를 ip에 저장해주면

    포인터 변수 ip에는 그림과같이 k의 주소가 저장된다.

     

     

     

    실제 코드로 간단히 확인할 수 있다.

    ip의 값에 k 변수의 주소값이 저장되어있는것을 확인할 수 있다.

     

    포인터 변수를 활용하여, 2개의 매개변수를 받아,

    해당 변수들의 값을 바꿔주는 코드를 예제로 풀어봤다.


    예제)

    #include <stdio.h>
    #include <stdlib.h>
    void swap(int*,int*);
    int main(){
    	int i = 100, j= 200;
    	printf("i=%d , j=%d\n" , i,j);
    	swap(&i,&j);
    	printf("i=%d , j=%d",i,j);
    	return 0;
    } 
    
    void swap(int *i, int *j){
    	int temp = *i;
    	*i = *j;
    	*j = temp;
    }

    swap이라는 함수는 매개변수의 주소를 받아, 해당 변수들의 값들을 바꿔주는 함수이다.

    그냥 매개변수 값을 전달해주면 main에서의 i와 j

    사용자 함수 swap에서의 i와 j는 주소가 다른  변수이기때문에

    swap에서는 값이 변할지라도, 

    main에서는 값이 변하지않는 문제가 발생한다.

     

    그래서, 변수의 주소를 넘겨주고 받음으로써, 문제를 해결할수 있다.

     

     


    포인터와 배열

     

    배열은 다른변수의 주소를 저장할때와 달리,

     

     

    pt = &a 가 아닌 pt = a 로 포인터변수 pt에 a배열의 주소를 바로 저장할 수 있다.

    그리고 해당 배열의 요소들의 주소도 확인할 수 있다.

     

    주소 말고 값을 확인할 때에도 

    a[0]과 pt[0]으로 똑같은 값을 출력받을 수 있다.

     


    정적할당

    - 프로그램이 시작되기 전 미리 정해진 크기의 메모리 확보
    - int a; // 4byte
    - int a[100]={0}; // 4byte*100
    * 위에 a배열에 50개의 데이터만 들어간다면 메모리낭비!

     

     


     

    동적할당

    - 프로그램 실행 중 동적으로 메모리 확보
    - free를 통하여 메모리 회수
    - 필요한 만큼만 할당 가능함
    - int * pt = (int *)malloc(50*sizeof(int));
    - free(pt);
    - 포인터나 배열처럼 활용이 가능하다.
    int * pt = (int * ) malloc(50 * sizeof(int));
    • int : 자료형
    • pt : 메모리 시작주소를 저장할 포인터 변수
    • (int*) : 정수형으로 메모리 확보
    • malloc(50 * sizeof(int)) : int(4byte) * 50 만큼의 메모리 확보.

     

    free(pt);
    • 동적 할당한 메모리를 회수
    • pt는 할당한 메모리의 시작주소를 가리킴
    728x90

    '개발 > 알아둘 기본 개념' 카테고리의 다른 글

    Spread 연산자 사용  (0) 2023.12.23
    비구조화 할당  (2) 2023.12.23
    프로세스와 쓰레드 개념 및 차이점  (0) 2023.09.22
    CORS와 SOP란?  (0) 2023.08.19
    JWT란?  (0) 2023.08.18

    댓글

Designed by Tistory.