배열 내의 요소 수를 확인하려면 어떻게 해야 합니까?
는 i i나 an an an i i i i i i i 。int
배열과 그 안에 있는 요소의 수를 찾아야 합니다. 관계가 있다는 걸 알아요.sizeof
어떻게 사용하는지 잘 모르겠어요.
내에 는, 「」를 사용할 수 .sizeof
바이트 단위로 크기를 결정하고 나눗셈을 사용하여 요소의 수를 계산합니다.
#define NUM_OF_ELEMS 10
int arr[NUM_OF_ELEMS];
size_t NumberOfElements = sizeof(arr)/sizeof(arr[0]);
배열을 사용하여 할 수 .sizeof
. 할 수 사이즈 정보를 저장/전달해야 사용할 수 있습니다.
void DoSomethingWithArray(int* arr, int NumOfElems)
{
for(int i = 0; i < NumOfElems; ++i) {
arr[i] = /*...*/
}
}
실제로 어레이에 저장되어 있는 요소의 수는 셀 수 없습니다.
그러나 size of 연산자를 사용하여 배열 길이 또는 크기를 확인할 수 있습니다.
하지만 배열에 몇 개의 요소가 있는지 찾을 수 없습니다.
어레이 컴파일러를 초기화할 때 프로그램에서 메모리를 [10](4사이즈 10블록)과 같이 제공하고, a[0]=1, a[1]=2, a[3]=8과 같은 인덱스에 값을 입력하면 모든 블록에 가비지 값이 있고, 다른 블록에는 가비지 값이 있고, 어느 값이 가비지인지 구분할 수 없기 때문에 얼마나 많은지 계산할 수 없습니다.구성 요소.이것이 당신의 이해에 도움이 되기를 바랍니다.작은 개념
int a[20];
int length;
length = sizeof(a) / sizeof(int);
할 수 있습니다.int
가 합니다.array
필요한 것은 다음과 같습니다.
int len = sizeof(array) / sizeof(array[0]);
저는 개인적으로 그 사이즈가 더 깨끗해 보인다고 생각합니다.
또, 매크로로서 정의하는 것도 선호합니다.
#define NUM(a) (sizeof(a) / sizeof(*a))
다음으로 for-loops에서 사용할 수 있습니다.따라서 다음과 같습니다.
for (i = 0; i < NUM(a); i++)
정말 쉬워요.
할당 .sizeof()
.
를 들어, called called음이다라는 정수 이 주어졌을 때,myArray
int numArrElements = sizeof(myArray) / sizeof(int);
배열의 데이터 유형이 일정하지 않고 변경될 수 있는 경우에는 방정식의 제수가 첫 번째 값의 크기를 데이터 유형의 크기로 사용하도록 합니다.
예를 들어 다음과 같습니다.
int numArrElements = sizeof(myArray) / sizeof(myArray[0]);
이렇게 하면 코드는 유형에 구애받지 않고 어레이의 데이터 유형에 관계없이 올바르게 작동합니다.
배열이 문자 배열이 아니면 배열의 요소 수를 찾을 수 없습니다.다음 예를 생각해 보겠습니다.
int main()
{
int arr[100]={1,2,3,4,5};
int size = sizeof(arr)/sizeof(arr[0]);
printf("%d", size);
return 1;
}
위의 값은 요소의 수가 5개라도 100이 됩니다.문자 배열인 경우 배열 끝에 있는 늘 문자열을 선형으로 검색하여 진행하면서 카운터를 늘릴 수 있습니다.
C++ 배열)을하면 됩니다.C++ 어 c c((((((((((((((C++:x
int x[10]
) ) ) 、 ), 、 ), 、 그 、 ), 、 ), 、 ), ), 、 ), ), ), ), ), ),
명확한 해결책은 다음과 같은 매크로(정의 1)입니다.
#define countof( array ) ( sizeof( array )/sizeof( array[0] ) )
배열하면 정답이 나오기 때문에 틀렸다고는 할 수 없습니다.그러나 배열이 아닌 다른 것을 제공할 때 동일한 표현은 잘못된 것을 제공합니다.예를 들어,
int * p;
countof( p )
int 포인터와 int의 사이즈가 같은 머신(Win32 플랫폼 등)에서는 항상 1이 됩니다.
또한 이 매크로는 멤버 함수 연산자가 있는 클래스의 개체를 잘못 받아들입니다.예를 들어, 다음과 같이 쓴다고 가정해 봅시다.
class IntArray {
private:
int * p;
size_t size;
public:
int & operator [] ( size_t i );
} x;
sizeof( x )
는 x 객체의 .x가 .버퍼의 크기가 아니라x.p
때문에 이 문제는 않습니다.countof( x )
.
따라서 정의 1은 컴파일러가 잘못 사용하는 것을 막을 수 없기 때문에 적절하지 않다고 판단됩니다.어레이만 전달할 수 있도록 강제하지 못합니다.
어떤 방법이 더 좋을까요?
컴파일러가 카운트할 파라미터가 항상 배열이 되도록 하려면 배열만 허용되는 컨텍스트를 찾아야 합니다.같은 컨텍스트에서 어레이 이외의 표현은 모두 거부해야 합니다.
일부 초보자(정의 2)는 다음과 같습니다.
template <typename T, size_t N>
size_t countof( T array[N] )
{
return N;
}
이 템플릿 함수는 N개 요소의 배열을 받아들여 N개를 반환합니다.
유감스럽게도 C++는 배열 파라미터를 포인터 파라미터와 동일하게 취급하기 때문에 컴파일되지 않습니다.즉, 위의 정의는 다음과 같습니다.
template <typename T, size_t N>
size_t countof( T * array )
{
return N;
}
이제 함수 본체가 N이 무엇인지 알 방법이 없다는 것이 명백해졌습니다.
그러나 함수가 배열 참조를 예상할 경우 컴파일러는 실제 파라미터의 크기가 선언과 일치하는지 확인합니다.즉, 정의 2를 약간의 수정(정의 3)으로 동작시킬 수 있습니다.
template <typename T, size_t N>
size_t countof( T (&array)[N] )
{
return N;
}
이 카운트는 매우 잘 작동하므로 포인터를 줘도 속일 수 없습니다.그러나 이것은 기능이지 매크로가 아닙니다.즉, 컴파일 시간 상수가 예상되는 곳에서는 사용할 수 없습니다.특히 다음과 같은 것은 쓸 수 없습니다.
int x[10];
int y[ 2*countof(x) ]; // twice as big as x
우리가 할 수 있는 일이 있나요?
누군가(누군지 모릅니다만, 모르는 작성자의 코드 조각으로 보았습니다)가 아이디어를 냈습니다.N을 함수의 본문에서 반환 타입으로 이동(예를 들어 함수가 N개의 요소를 배열로 반환)하면 함수를 실제로 호출하지 않고도 N의 값을 얻을 수 있습니다.
정확히 말하면 C++에서는 어레이를 직접 반환할 수 없기 때문에 함수가 어레이 참조를 반환하도록 해야 합니다.
이 기능의 실장은 다음과 같습니다.
template <typename T, size_t N>
char ( &_ArraySizeHelper( T (&array)[N] ))[N];
#define countof( array ) (sizeof( _ArraySizeHelper( array ) ))
확실히, 구문은 끔찍해 보입니다.사실, 약간의 설명이 필요하다.
첫째, 가장 중요한 것은
char ( &_ArraySizeHelper( ... ))[N];
라고 말하다_ArraySizeHelper
는 N개의 요소의 char 배열에 대한 참조(&에 주의)를 반환하는 함수입니다.
다음으로 기능 파라미터는
T (&array)[N]
N개 요소의 T 배열에 대한 참조입니다.
ㅇㅇㅇㅇㅇ.countof
는 함수 됩니다._ArraySizeHelper
단, 이렇게 도 없습니다_ArraySizeHelper()
선언으로 충분합니다.
이 새로운 정의를 통해
int x[10];
int y[ 2*countof(x) ]; // twice as big as x
우리가 원하는 대로 유효하게 된다.
난금지 복복? 저는 이 가 방문했던 보다 확실히 .우선 함수 내부에 정의된 유형에서는 작동하지 않습니다. 함수가 'Template Function'이기 _ArraySizeHelper
는 글로벌 스코프에서 액세스 가능한 타입을 상정하고 있습니다.
더 좋은 해결책이 없어요.아는 사람 있으면 알려주세요.
void numel(int array1[100][100])
{
int count=0;
for(int i=0;i<100;i++)
{
for(int j=0;j<100;j++)
{
if(array1[i][j]!='\0')
{
count++;
//printf("\n%d-%d",array1[i][j],count);
}
else
break;
}
}
printf("Number of elements=%d",count);
}
int main()
{
int r,arr[100][100]={0},c;
printf("Enter the no. of rows: ");
scanf("%d",&r);
printf("\nEnter the no. of columns: ");
scanf("%d",&c);
printf("\nEnter the elements: ");
for(int i=0;i<r;i++)
{
for(int j=0;j<c;j++)
{
scanf("%d",&arr[i][j]);
}
}
numel(arr);
}
이것은, 초기화중에 말한 어레이 사이즈에 관계없이, 매트릭스내의 요소의 정확한 수를 나타내고 있습니다( ).그런 뜻이라면)
배열이 이 형식으로 선언된 경우에만 배열 내의 요소 수를 찾을 수 있습니다.
int a[]={1,2,3,4,5,6};
배열의 요소 수는
n=sizeof(a) / sizeof(a[0]);
할 수 .int a[10]={1,2,3,4,5,6}
2차원 배열의 요소 수를 평가하기 위해 위와 같은 코드를 사용했습니다.
#include <stdio.h>
#include <string.h>
void main(void)
{
char strs[3][20] =
{
{"January"},
{"February"},
{""}
};
int arraysize = sizeof(strs)/sizeof(strs[0]);
for (int i = 0; i < arraysize; i++)
{
printf("Month %d is: %s\n", i, strs[i]);
}
}
잘 먹힌다.C 어레이에서는 다른 데이터 타입을 혼재시킬 수 없고, 모든 어레이 요소의 사이즈가 같아야 합니다(내 말이 맞다면).따라서 이 작은 트릭으로 이점을 얻을 수 있습니다.
- size of() 함수가 있는 2d 배열 전체의 바이트 수(이 경우 3*20 = 60바이트)
- 첫 번째 어레이 요소 strs[0]의 sizeof() 함수가 있는 바이트 수(이 경우 20바이트)
- 한 요소의 크기로 전체 크기를 나누면 여러 요소를 얻을 수 있습니다.
이 칩은 C의 2D 어레이에서는 이식 가능해야 하지만 다른 프로그래밍 언어에서는 크기가 다른 어레이 내에서 다른 데이터 유형을 사용할 수 있기 때문에 작동하지 않습니다(JAVA 등).
이와 같이 루프 내의 어레이 길이를 쉽게 실행할 수 있는 방법을 찾았습니다.
int array[] = {10, 20, 30, 40};
int i;
for (i = 0; i < array[i]; i++) {
printf("%d\n", array[i]);
}
#include<stdio.h>
int main()
{
int arr[]={10,20,30,40,50,60};
int *p;
int count=0;
for(p=arr;p<&arr+1;p++)
count++;
printf("The no of elements in array=%d",count);
return 0;
}
출력=6
설명.
p
1차원 배열에 대한 포인터입니다.루프 내에서는for(p=arr,p<&arr+1;p++)
나는 만들었다p
기본 주소를 가리킵니다.베이스 주소를 1000이라고 합니다.증가하면p
1002를 가리키고 있습니다.이제 개념에 대해서 말씀드리자면&arr
- 기본적으로 어레이 전체를 나타내며, 어레이 전체에 1을 더하면 다음과 같습니다. &arr+1
주소 1012, 즉 다음 1-D 어레이의 주소(이 경우 int의 크기는 2)를 제공하므로 조건은 1000<1012가 됩니다.
그래서 기본적으로 조건이
for(p=1000;p<1012;p++)
이제 상태를 확인하고 값을 세어 보겠습니다.
- 번째 ★★
p=1000
★★★★★★★★★★★★★★★★★」p<1012
은 「」입니다.true
count
까지. - 번째 두째
p=1002
★★★★★★★★★★★★★★★★★」p<1012
은 「」입니다.true
count
까지. - ...
- ★★★★★★★★★★★★★★★」
p=1010
★★★★★★★★★★★★★★★★★」p<1012
은 「」입니다.true
count
6파운드까지. - ★★★★★★★★★★★★★★★★.
p=1012
★★★★★★★★★★★★★★★★★」p<1012
이 false: "false: "false" 값을 합니다.count=6
printf
★★★★★★ 。
어레이 내의 요소의 수와 런타임에 사용자가 언제 입력을 했는지 모르는 경우.그러면 코드를 다음과 같이 쓸 수 있습니다.
C 코드:
while(scanf("%d",&array[count])==1) {
count++;
}
C++ 코드:
while(cin>>a[count]) {
count++;
}
이제 입력된 어레이 요소의 개수가 카운트됩니다.
실제로 동적 정수 배열의 요소를 계산하는 적절한 방법은 없습니다.그러나 리눅스에서는 명령 크기가 제대로 작동하지만 윈도우즈에서는 제대로 작동하지 않습니다.프로그래머의 관점에서 볼 때 동적 배열의 요소 수를 가져오기 위해 size of를 사용하는 것은 권장되지 않습니다.배열을 작성할 때 요소의 수를 파악해야 합니다.
sizeof
이치노네가 원하는 건 아니지만 도움이 될 수 있어
예를 들어 어레이가 있다고 합시다.
int array[4];
「」를 sizeof
( 레 to ( 。sizeof(array)
는 바이트 이 4 * a ) 。4*로 하다int
(실장에 따라서는) 총 16바이트가 될 수 있습니다.
「」를 sizeof
어레이의 요소에 접속합니다).sizeof(array[0])
는 바이트 이는, 「」의 입니다.이 경우 이 크기는int
총 4바이트(실장 상황에 따라 다름)가 될 수 있습니다.
첫 번째 것을 두 번째 것으로 나누면, (4 * 크기)int
/ ( / (:int
= 4 ; (4 ; )
그러면 다음과 같이 됩니다.
sizeof(array) / sizeof(array[0])
이 논리를 캡슐화하기 위한 매크로가 필요하기 때문에 그 실행 방법을 다시 생각할 필요가 없습니다.
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
연산자의 우선순위와 관련된 예기치 않은 버그를 피하기 위해 다른 복잡한 매크로와 마찬가지로 모든 매크로와 모든 변수를 괄호로 묶어야 합니다.
다음과 같은 어레이에서 사용할 수 있습니다.
int array[6];
ptrdiff_t nmemb;
nmemb = ARRAY_SIZE(array);
/* nmemb == 6 */
배열로 선언된 함수의 인수는 실제로는 배열이 아니라 배열의 첫 번째 요소에 대한 포인터이므로 이 인수에 대해서는 작동하지 않습니다.
void foo(int false_array[6])
{
ptrdiff_t nmemb;
nmemb = ARRAY_SIZE(false_array);
/* nmemb == sizeof(int *) / sizeof(int) */
/* (maybe ==2) */
}
그러나 어레이뿐만 아니라 어레이에 포인터를 전달하면 기능에서 사용할 수 있습니다.
void bar(int (*arrptr)[7])
{
ptrdiff_t nmemb;
nmemb = ARRAY_SIZE(*arrptr);
/* nmemb == 7 */
}
합니다.1,3,4
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,sizeof
뭇매를 맞다
int myArray[] = {1,3,4};
int len = sizeof(myArray) / sizeof(myArray[0]);
다음과 같이 출력을 인쇄하여 요소의 수를 확인할 수 있습니다.
cout<<"This array has " << len << " elements";
전체 프로그램은 다음과 같습니다.
#include <iostream>
using namespace std;
int main()
{
int myArray[] = {1,3,4};
int len = sizeof(myArray) / sizeof(myArray[0]);
cout<<"The array has " << len << "elements";
return 0;
}
언급URL : https://stackoverflow.com/questions/10290610/how-can-i-find-the-number-of-elements-in-an-array
'source' 카테고리의 다른 글
ImageView 폭과 높이를 프로그래밍 방식으로 설정하시겠습니까? (0) | 2022.08.12 |
---|---|
Vue Router는 동적으로 부하가 높은 아이에게 소품을 전달합니다. (0) | 2022.08.12 |
Vue 부트스트랩 - 동적으로 렌더링된 HTML에 대해 툴팁이 작동하지 않음 (0) | 2022.08.12 |
Vuejs - vuex 지연 부하 (0) | 2022.08.12 |
v-bind:style은 width css 속성을 어떻게 수정합니까? (0) | 2022.08.12 |