source

배열 내의 요소 수를 확인하려면 어떻게 해야 합니까?

factcode 2022. 8. 12. 23:17
반응형

배열 내의 요소 수를 확인하려면 어떻게 해야 합니까?

는 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 어레이에서는 다른 데이터 타입을 혼재시킬 수 없고, 모든 어레이 요소의 사이즈가 같아야 합니다(내 말이 맞다면).따라서 이 작은 트릭으로 이점을 얻을 수 있습니다.

  1. size of() 함수가 있는 2d 배열 전체의 바이트 수(이 경우 3*20 = 60바이트)
  2. 첫 번째 어레이 요소 strs[0]의 sizeof() 함수가 있는 바이트 수(이 경우 20바이트)
  3. 한 요소의 크기로 전체 크기를 나누면 여러 요소를 얻을 수 있습니다.

이 칩은 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

설명.

p1차원 배열에 대한 포인터입니다.루프 내에서는for(p=arr,p<&arr+1;p++)나는 만들었다p기본 주소를 가리킵니다.베이스 주소를 1000이라고 합니다.증가하면p1002를 가리키고 있습니다.이제 개념에 대해서 말씀드리자면&arr- 기본적으로 어레이 전체를 나타내며, 어레이 전체에 1을 더하면 다음과 같습니다. &arr+1주소 1012, 즉 다음 1-D 어레이의 주소(이 경우 int의 크기는 2)를 제공하므로 조건은 1000<1012가 됩니다.

그래서 기본적으로 조건이

for(p=1000;p<1012;p++)

이제 상태를 확인하고 값을 세어 보겠습니다.

  • 번째 ★★p=1000 ★★★★★★★★★★★★★★★★★」p<1012은 「」입니다.truecount까지.
  • 번째 두째p=1002 ★★★★★★★★★★★★★★★★★」p<1012은 「」입니다.truecount까지.
  • ...
  • ★★★★★★★★★★★★★★★」p=1010 ★★★★★★★★★★★★★★★★★」p<1012은 「」입니다.truecount6파운드까지.
  • ★★★★★★★★★★★★★★★★.p=1012 ★★★★★★★★★★★★★★★★★」p<1012이 false: "false: "false" 값을 합니다.count=6printf★★★★★★ 。

어레이 내의 요소의 수와 런타임에 사용자가 언제 입력을 했는지 모르는 경우.그러면 코드를 다음과 같이 쓸 수 있습니다.

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

반응형