티스토리 뷰
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 |