티스토리 뷰

BackEnd/C

[8일차] 포인터의 선언과 사용

JINSUKUKU 2021. 2. 17. 23:35

2021.02.17.수

포인터

✔  변수의 메모리 주소를 구할 때에는 변수 앞에 주소 연산자 & 를 사용한다. ( &는 ~의 주소를 의미)

✔  메모리 주소를 출력하고자 한다면, 형식 지정자 %p와  ~의 주소를 의미하는 주소 연산자를 사용한다.

#include <stdio.h>

int main(void){
  int a = 10;
  printf("%p", &a);  //0x7ffd8ff8b0e4
  return 0;
}

✔  이러한 메모리 주소는 포인터 변수에 저장할 수 있다.

✔  포인터 변수를 선언할 때에는 변수와 같은 방법으로 선언하되, * 을 사용하여 아래와 같이 선언한다. 

#include <stdio.h>

int main(void){
  int a = 10;
  int *p = &a;
  
  printf("%p\n", &a);  //0x7ffd8ff8b0e4
  printf("%p\n", p);   //0x7ffd8ff8b0e4
  
  return 0;
}

✔  포인터 변수 *p 에 정수형 변수의 주소를 저장하므로, 포인터 변수의 자료형도 int 로 선언.

✔  포인터 변수 *p 에 정수형 변수 a의 주소를 저장해야 하므로 주소 연산자 &를 사용. (&는 ~의 주소를 의미)

✔  포인터 변수 *p 에 정수형 변수 a의 주소를 저장했으므로, 두 가지 출력 모두 같은 주소를 출력.

✔  주소 연산자 & 는 단항 연산자이므로 주의.

#inlcude <stdio.h>

int main(void){
  int a = 10;
  int *p = &a;		//포인터 변수임을 알리는 *
  printf("%d", *p);	//포인터에 저장된 주소로 이동하겠다는 용도 * (역참조 연산자)
  return 0;
}

✔ 포인터를 선언할 때도 * 을 사용하고, 역참조를 할 때에도 *을 사용.

포인터 변수를 선언할 때에는, 포인터 변수임을 알리기 위한 용도.

역참조를 하는 경우에는 ~의 주소로 이동하라는 의미.

 

 

포인터의 크기
#include <stdio.h>

int main(void){

    printf("> 자료형 크기\n");
    printf("int의 크기\t : %lu byte\n", sizeof(int));		//4
    printf("char의 크기\t : %lu byte\n", sizeof(char));	//1
    printf("double의 크기\t : %lu byte\n", sizeof(double));	//8
    printf("float의 크기\t : %lu byte\n\n", sizeof(float));	//4

    printf("> 포인터 크기\n");
    printf("int*의 크기\t : %lu byte\n", sizeof(int*));	//8
    printf("char*의 크기\t : %lu byte\n", sizeof(char*));	//8
    printf("double*의 크기\t : %lu byte\n", sizeof(double*));	//8
    printf("float*의 크기\t : %lu byte\n", sizeof(float*));	//8
    
}

✔ 시스템이 32bit인지 64bit인지에 따라 포인터의 크기가 달라진다.

✔ 32bit 주소 체계에서는 포인터 변수가 32bit의 크기를 가지므로, sizeof 함수를 사용하면 4byte를 반환한다.

 32bit 주소 체계에서는 포인터 변수가 64bit의 크기를 가지므로, sizeof 함수를 사용하면 8byte를 반환한다.

 

 

 

 


(+) 21.02.21 좀 헷갈려서 이것저것 실험해봤다.

#include <stdio.h>
#include <stdlib.h>

int main(void){
    int size;
    scanf("%d",&size);
    int *arr = (int *)malloc(sizeof(int)*size);

    for(int i=0; i<size; i++){
        scanf("%d", (arr+i)); //연산자 &와 *이 필요없음
    }

    // printf("%d\n",arr);  //오류 발생
    printf("%p\n",arr);
    printf("****\n");
    printf("%d\n",*arr);
    // printf("%p\n",*arr); //오류 발생

    free(arr);
    return 0;
}   

int * 이 말하자면 포인터의 자료형이고, arr가 포인터의 이름이므로 arr그 자체가 주소를 저장하는 공간의 이름...

그래서 형식지정자 %p를 사용할 때에는 굳이 *연산자를 붙일 이유가 없다. arr = 주소값이니까! 그리고 해당 주소에 저장된 값을 확인하려면 *을 사용해야하는데, 이는 arr에 저장된 주소로 이동하라라는 의미라서 그렇다.

 

아, 포인터 변수를 선언할 때와 실제 명령문에서 사용할 때 용도가 다르다더니 이거구나. 변수를 선언할 때에는 포인터 변수임을 알리는 장치이고, 명령문 내부에서는 ~의 주소로 이동하라는 의미! 좋아좋아.

 

 

 

 

[참고] 한빛미디어-혼자 공부하는 C언어 유튜브 강의 / 엘리스 트랙-혼자 공부하는 C언어 / 길벗-C언어 코딩도장 / 위키백과

'BackEnd > C' 카테고리의 다른 글

[11일차] 함수/배열 복습  (0) 2021.02.23
[10일차] 제어문 복습  (0) 2021.02.20
[7일차] 2. 문자열 관련 함수 정리  (0) 2021.02.17
[7일차] 1. 문자열(char형 배열)  (0) 2021.02.16
[6일차] 2. 배열  (0) 2021.02.15
댓글
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
최근에 올라온 글
글 보관함
Total
Today
Yesterday