sizeof演算子とポインター演算を使用して、Cでアレイのサイズを見つけます
この投稿では、Cでアレイのサイズを見つけるために利用できるいくつかの選択肢の概要を説明します。
1.sizeof演算子
標準的な方法は、 sizeof
Cスタイルのアレイのサイズを見つける演算子。 The sizeof
アレイの演算子は、アレイが占有する合計メモリをバイト単位で返します。アレイ要素の総数を決定するための秘訣は、アレイが占める合計メモリを各要素のサイズで割ることです。これは、以下のCで示されています。
1 2 3 4 5 6 7 8 9 10 11 |
#include <stdio.h> int main(void) { int arr[] = { 1, 2, 3, 4, 5 }; size_t n = sizeof(arr)/sizeof(arr[0]); printf("The size of the array is %d", n); return 0; } |
簡単にし、コードの可読性を向上させるために、以下に示すように、それからMACROを構築することをお勧めします。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#include <stdio.h> #define SIZEOF(a) sizeof(a)/sizeof(*a) int main(void) { int arr[] = { 1, 2, 3, 4, 5 }; size_t n = SIZEOF(arr); printf("The size of the array is %d", n); return 0; } |
私たちはそれを知っています アレイはポインタに減衰します パラメータが次のように宣言されているかどうかに関係なく、引数として関数に渡された場合 int[]
か否か。したがって、上記のアプローチは静的配列でのみ機能しますが、動的に割り当てられた配列では失敗します。 関数パラメータ どちらもポインタを必要とするためです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#include <stdio.h> #include <stdlib.h> #define N 5 //アレイはポインタに減衰します size_t getSize(int *arr) { size_t n = sizeof(arr)/sizeof(arr[0]); return n; } int main(void) { int *a = malloc(N * sizeof(int)); printf("%zu\n", sizeof(a)/sizeof(a[0])); //これは機能しません int b[] = { 1, 2, 3, 4, 5 }; printf("%zu\n", getSize(b)); //これは機能しません return 0; } |
2.ポインタ演算の使用
秘訣は、式を使用することです (&arr)[1] - arr
アレイを取得するには arr
サイズ。両方 arr
と &arr
同じメモリ位置を指しますが、どちらもタイプが異なります。
arr
タイプがありますint*
アレイの最初の要素へのポインタに減衰します。したがって、アレイのサイズに関する知識はなくなります。&arr
タイプのポインタになりますint (*)[n]
、つまり、のアレイへのポインタn
ints。そう、&arr
アレイ全体を指し、*(&arr + 1)
(また&arr)[1]
)アレイの次のバイトを指します。
これは、Cでのポインター演算の動作方法のために機能します。 int
によって進められます sizeof(int)
1ずつインクリメントする場合。同様に、 int[n]
によって進められます sizeof(int[n])
、これはアレイ全体のサイズです。
1 2 3 4 5 6 7 8 9 10 11 |
#include <stdio.h> int main(void) { int arr[] = { 1, 2, 3, 4, 5 }; size_t n = (&arr)[1] - arr; printf("The size of the array is %d", n); return 0; } |
これで、sizeof演算子とポインター演算を使用してCでアレイのサイズを見つけることができます。
続きを読む: