티스토리 뷰
예전에 sizeof를 공부하였지만 헷갈려서 제대로 알고 넘어가고자 정리해보았다.
목차
1. sizeof 연산자를 활용한 자료형의 크기
2. sizeof 연산자를 활용한 배열의 크기
3. sizeof를 활용한 주소와 포인터의 크기
4. sizeof를 이용힌 이차원 배열 크기 알아보기
1. sizeof 연산자를 활용한 자료형의 크기
int a = 10;
double b = 3.4;
printf("int형 변수의 크기 : %d\n", sizeof(a)); // int형 변수의 크기 : 4
printf("double형 변수의 크기 : %d\n", sizeof(b)); // double형 변수의 크기 : 8
printf("정수형 변수의 크기 : %d\n", sizeof(10)); // 정수형 변수의 크기 : 4
printf("수식의 결과값의 크기 : %d\n", sizeof(1.5 + 3.4)); // 수식의 결과값의 크기 : 8
printf("char 자료형의 크기 : %d\n", sizeof(char)); // char 자료형의 크기 : 1
sizeof 연산자로 자료형의 크기를 계산하면 각 자료형의 크기 값이 나온다.
2. sizeof 연산자를 활용한 배열의 크기
int arr1[7];
int arr2[9] = {5, 9, 12, 36};
int count1, count2;
printf("arr1[7] 자료형의 크기 : %d\n", sizeof(arr1)); // arr1[7] 자료형의 크기 : 28
printf("arr2[9] 자료형의 크기 : %d\n", sizeof(arr2)); // arr2[9] 자료형의 크기 : 36
printf("arr1[0] 자료형의 크기 : %d\n", sizeof(arr1[0])); // arr1[0] 자료형의 크기 : 4
printf("arr2[0] 자료형의 크기 : %d\n", sizeof(arr1[0])); // arr2[0] 자료형의 크기 : 4
count1 = sizeof(arr1) / sizeof(arr1[0]);
count2 = sizeof(arr2) / sizeof(arr2[0]);
printf("count1 배열의 개수 %d\n", count1); // count1 배열의 개수 : 7
printf("count2 배열의 개수 %d\n", count2); // count2 배열의 개수 : 9
이번에는 sizeof 연산자를 활용하여 배열의 크기를 알아보았다.
배열의 전체 크기(자료형의 크기 * 배열의 개수)를 배열의 자료형 크기로 나눈 값이 sizeof(arr1) / sizeof(arr1[0])이다.
그래서 배열의 개수를 알기 위해서 sizeof(arr1) / sizeof(arr1[0]) 해주면 하드코딩을 하지않고 코딩을 할 수 있다.
3. sizeof를 활용한 주소와 포인터의 크기
char ch = 55;
int in;
double db;
char* pc = &ch;
int* pi = ∈
double* pd = &db;
printf("char형 변수의 주소 크기 : %d\n", sizeof(&ch)); // char형 변수의 주소 크기 : 4
printf("int형 변수의 주소 크기 : %d\n", sizeof(&in)); // int형 변수의 주소 크기 : 4
printf("double형 변수의 주소 크기 : %d\n", sizeof(&db)); // double형 변수의 주소 크기 : 4
printf("char * 포인터의 크기 : %d\n", sizeof(&pc)); // char * 포인터의 크기 : 4
printf("int * 포인터의 크기 : %d\n", sizeof(&pi)); // int * 포인터의 크기 : 4
printf("double * 포인터의 크기 : %d\n", sizeof(&pd)); // double * 포인터의 크기 : 4
printf("pc 포인터의 주소 : %d\n", &pc); //pc 포인터의 주소 : 11533636
printf("pc 포인터의 값 : % d\n", pc); ; //pc 포인터의 주소 : 11533636
printf("char * 포인터가 가리키는 변수의 주소 : %d\n\n", &ch); // char * 포인터가 가리키는 변수의 주소 : 11533636
printf("pc* 포인터가 가리키는 값 : %d\n\n", *pc); // pc* 포인터가 가리키는 값 : 55
printf("char * 포인터가 가리키는 변수의 크기 : %d\n", sizeof(*pc)); // char* 포인터가 가리키는 변수의 크기 : 1
printf("int * 포인터가 가리키는 변수의 크기 : %d\n", sizeof(*pi)); // int * 포인터가 가리키는 변수의 크기 : 4
printf("double * 포인터가 가리키는 변수의 크기 : %d\n", sizeof(*pd)); // double * 포인터가 가리키는 변수의 크기 : 8
포인터의 크기는 x86이면 4byte이고 x64이면 8byte이다. 이 점을 주의하자.
sizeof(&ch)나 sizeof(&pc) 둘 다 포인터 자료형이기 때문에 x86이면 4byte이고 x64이면 8byte가 나온다.
그리고 sizeof(*pc)는 pc의 값을 역참조(dereferencing)하여 값을 가져온다. 그래서 자료형의 크기로 계산이 된다.
4. sizeof를 이용힌 이차원 배열 크기 알아보기
int arr[15][20];
int v = sizeof(arr) / sizeof(arr[0]);
int h = sizeof(arr[0]) / sizeof(int);
printf("arr의 세로길이 : %d\narr의 가로길이 : %d\n", v, h); // arr의 세로길이 : 15, arr의 가로길이 : 20
printf("arr[0] 크기: %d\n", sizeof(arr[0])); // arr[0] 크기: 80
printf("arr의 * 포인터의 크기: %d\n", sizeof(arr)); //arr의 * 포인터의 크기: 1200
이차원의 크기를 알아볼려면 위와 같은 코드를 확인하면 된다.
이차원 배열의 sizeof(arr[0]) 값은 열의 크기인 20*4 = 80이다.
sizeof(arr[0]) 로 arr의 전체 크기인 size(arr)를 나누어주면 행의 개수가
arr[0] 크기로 배열 자료형의 크기를 나누어주는 sizeof(arr[0]) / sizeof(int)를 계산하면 열의 크기가 나온다.
정리 빡시게 했으니 이제 헷갈리지 말자.
참조
- 혼자 공부하는 C언어(책)
- ([C언어] 13강) sizeof함수로 배열 길이 구하기 (블로그)
'프로그래밍 정보 > C' 카테고리의 다른 글
[C언어]문자열, scanf, gets, fgets로 입력 받기 (0) | 2023.09.05 |
---|---|
[C/C++] 1차원 배열과 포인터, 2차원 배열과 포인터 정리 (0) | 2023.05.05 |
[C++] 버퍼와 표준출력 시 endl과 '\n'의 차이 (2) | 2023.04.25 |
C언어 - 포인터 이해하기 (0) | 2023.04.24 |
- Total
- Today
- Yesterday
- 20.03.11.(목)
- raspberrypi
- QT
- NestJS
- opencv
- variable
- JavaScript
- C
- 스타벅스
- 미라클모닝
- Til
- var
- 포인터
- CSS
- tailwindcss
- Python
- JSON
- 자바스크립트
- SQL
- tailwind
- Linux
- 라즈베리파이
- 모닝독서
- yocto
- 재미있는
- 오늘의 공부
- 초아
- Kernel
- JS
- js syntax
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |