sizeof를 사용하지 않고 C/C++에서 배열의 sizeof를 찾을 수 있는 방법이 있을까요?
포인터는 pointer의 도움으로 모든 작업을 쉽게 수행할 수 있는 놀라운 C 언어 도구 중 하나입니다. 이전 기사에서 sizeof() 연산자를 사용하지 않고 구조체의 크기를 계산하는 방법을 알아 보았습니다.
이 글에서는 sizeof() 연산자를 사용하지 않고 배열의 sizeof를 계산하고 있습니다. sizeof() 연산자를 사용하지 않고 c에서 배열의 크기를 계산하는 것은 어려운 것처럼 보이지만 포인터 산술의 도움으로 쉽게 할 수 찾을 수 있습니다.
C 언어에서 포인터를 늘리거나 줄일 때 포인터는 다음 또는 이전 메모리 위치를 가리킵니다. 다음 또는 이전 위치는 포인터 유형에 따라 다릅니다. pfData가 float에 대한 포인터이고 float 크기가 4바이트라면 다음 위치는 현재 위치보다 4바이트 앞선 위치가 될 것입니다.
사진 설명을 입력하세요.
요소의 데이터 유형을 모른 채 배열의 항목 개수(배열 크기)를 계산하는 몇 가지 예제 프로그램을 살펴 봅시다.
예제 프로그램 1:
#include <stdio.h>
int main(int argc, char *argv[])
{
int iTotalElement = 0 ;
int aiData[] = {10, 20, 30, 40, 50, 60};
//Calculate numbers of elements using pointer arithmetic
iTotalElement = *(&aiData + 1) - aiData;
printf("Number of element = %d",iTotalElement);
return 0;
}
결과:
위의 개념을 이해하기 전에 배열과 포인터의 관계를 되돌아 보도록 하겠습니다.
aiData가 정수 배열이면 &aiData[i]는 정수에 대한 포인터가 되고, 그 값은 i번째 항목의 주소라고 가정해 봅시다. 우리는 이 문장을 수학적 형식으로 표현할 수도 있습니다.
aiData[i] = *(aiData + i);
*(aiData + i) = aiData[i];
(aiData + i) = &aiData[i];
i의 값이 0 이라면,
이 말은 배열 이름이 첫 번째 항목 주소임을 뜻합니다.
사진 설명을 입력하세요.
참고: 하지만 배열 이름 앞에 앰퍼샌드(&)를 넣으면 유형이 변경 되는 데, 이는 배열에 대한 포인터가 됩니다.
요컨대 우리는 이것을 다음과 같이 표현 할 수 있습니다.
aiData ====> 배열의 첫 번째 요소에 대한 포인터.
&aiData ====> 6개 항목을 가진 배열에 대한 포인터.
&aiData + 1 ====> 다음 메모리 블록의 주소(정수 6개 앞의 주소)
*(&aiData+ 1) ====> *(&aiData + 1)을 역참조하면 두 번째 메모리 블록의 첫 번째 항목 주소가 됩니다.
*(&aiData+ 1) – aiData ====> *(&aiData + 1)은 정수 6개 앞의 주소를 가리키므로 둘 사이의 차이는 6입니다.
예제 프로그램 2:
매크로를 사용하여 자체 sizeof 연산자를 만들어 배열의 총 항목 수를 계산 합니다.
#include <stdio.h>
// User created size of operator
#define SIZEOF(Var) ((char*)(&Var + 1) -(char*)&Var)
int main(int argc, char *argv[])
{
int iTotalElement = 0 ;
int aiData[] = {10, 20, 30, 40, 50, 60};
iTotalElement = SIZEOF(aiData)/SIZEOF(aiData[0]);
printf("Number of element = %d",iTotalElement);
return 0;
}
결과:
이상.
'프로그래밍' 카테고리의 다른 글
[C#.NET]여러가지 머신레벨의 시스템 정보 얻는 방법 (0) | 2023.02.05 |
---|---|
[C#.NET] 모든 WMI 클래스 속성 찾아내기 (0) | 2023.02.04 |
[C#] quartz 모듈 사용하기 (0) | 2023.01.28 |
파이썬 사용해보기 - 5 (0) | 2023.01.27 |
파이썬 사용해보기-4 (1) | 2023.01.26 |