C言語 #12: sizeof 演算子

独習C

sizeof演算子は、指定されたデータ型または変数のメモリサイズをバイト単位で返すために使用されます。メモリ管理やデータ構造の最適化において重要な役割を果たします。ここでは、C言語のsizeof演算子について詳しく説明します。

基本的な使い方

sizeof演算子の基本的な使い方を見てみましょう。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
#include <stdio.h>
int main() {
int a;
printf("int のサイズ: %zu バイト\n", sizeof(int));
printf("変数a のサイズ: %zu バイト\n", sizeof(a));
return 0;
}
#include <stdio.h> int main() { int a; printf("int のサイズ: %zu バイト\n", sizeof(int)); printf("変数a のサイズ: %zu バイト\n", sizeof(a)); return 0; }
#include <stdio.h>

int main() {
    int a;
    printf("int のサイズ: %zu バイト\n", sizeof(int));
    printf("変数a のサイズ: %zu バイト\n", sizeof(a));

    return 0;
}

データ型のサイズ

sizeof演算子を使用して、C言語の基本的なデータ型のサイズを取得することができます。

整数型

  • char
  • short
  • int
  • long
  • long long
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
#include <stdio.h>
int main() {
printf("char のサイズ: %zu バイト\n", sizeof(char));
printf("short のサイズ: %zu バイト\n", sizeof(short));
printf("int のサイズ: %zu バイト\n", sizeof(int));
printf("long のサイズ: %zu バイト\n", sizeof(long));
printf("long long のサイズ: %zu バイト\n", sizeof(long long));
return 0;
}
#include <stdio.h> int main() { printf("char のサイズ: %zu バイト\n", sizeof(char)); printf("short のサイズ: %zu バイト\n", sizeof(short)); printf("int のサイズ: %zu バイト\n", sizeof(int)); printf("long のサイズ: %zu バイト\n", sizeof(long)); printf("long long のサイズ: %zu バイト\n", sizeof(long long)); return 0; }
#include <stdio.h>

int main() {
    printf("char のサイズ: %zu バイト\n", sizeof(char));
    printf("short のサイズ: %zu バイト\n", sizeof(short));
    printf("int のサイズ: %zu バイト\n", sizeof(int));
    printf("long のサイズ: %zu バイト\n", sizeof(long));
    printf("long long のサイズ: %zu バイト\n", sizeof(long long));

    return 0;
}

浮動小数点型

  • float
  • double
  • long double
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
#include <stdio.h>
int main() {
printf("float のサイズ: %zu バイト\n", sizeof(float));
printf("double のサイズ: %zu バイト\n", sizeof(double));
printf("long double のサイズ: %zu バイト\n", sizeof(long double));
return 0;
}
#include <stdio.h> int main() { printf("float のサイズ: %zu バイト\n", sizeof(float)); printf("double のサイズ: %zu バイト\n", sizeof(double)); printf("long double のサイズ: %zu バイト\n", sizeof(long double)); return 0; }
#include <stdio.h>

int main() {
    printf("float のサイズ: %zu バイト\n", sizeof(float));
    printf("double のサイズ: %zu バイト\n", sizeof(double));
    printf("long double のサイズ: %zu バイト\n", sizeof(long double));

    return 0;
}

配列と構造体のサイズ

sizeof演算子は、配列や構造体のサイズを取得するためにも使用されます。

配列のサイズ

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
#include <stdio.h>
int main() {
int arr[10];
printf("配列arr のサイズ: %zu バイト\n", sizeof(arr));
printf("配列の要素数: %zu\n", sizeof(arr) / sizeof(arr[0]));
return 0;
}
#include <stdio.h> int main() { int arr[10]; printf("配列arr のサイズ: %zu バイト\n", sizeof(arr)); printf("配列の要素数: %zu\n", sizeof(arr) / sizeof(arr[0])); return 0; }
#include <stdio.h>

int main() {
    int arr[10];
    printf("配列arr のサイズ: %zu バイト\n", sizeof(arr));
    printf("配列の要素数: %zu\n", sizeof(arr) / sizeof(arr[0]));

    return 0;
}

構造体のサイズ

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
#include <stdio.h>
struct Person {
char name[50];
int age;
float height;
};
int main() {
struct Person person;
printf("構造体Person のサイズ: %zu バイト\n", sizeof(struct Person));
printf("変数person のサイズ: %zu バイト\n", sizeof(person));
return 0;
}
#include <stdio.h> struct Person { char name[50]; int age; float height; }; int main() { struct Person person; printf("構造体Person のサイズ: %zu バイト\n", sizeof(struct Person)); printf("変数person のサイズ: %zu バイト\n", sizeof(person)); return 0; }
#include <stdio.h>

struct Person {
    char name[50];
    int age;
    float height;
};

int main() {
    struct Person person;
    printf("構造体Person のサイズ: %zu バイト\n", sizeof(struct Person));
    printf("変数person のサイズ: %zu バイト\n", sizeof(person));

    return 0;
}

ポインタのサイズ

ポインタのサイズもsizeof演算子を使って取得できます。ポインタのサイズは、ポインタが指すデータ型に関係なく、通常のシステムで同じサイズです。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
#include <stdio.h>
int main() {
int *p;
char *q;
double *r;
printf("int ポインタのサイズ: %zu バイト\n", sizeof(p));
printf("char ポインタのサイズ: %zu バイト\n", sizeof(q));
printf("double ポインタのサイズ: %zu バイト\n", sizeof(r));
return 0;
}
#include <stdio.h> int main() { int *p; char *q; double *r; printf("int ポインタのサイズ: %zu バイト\n", sizeof(p)); printf("char ポインタのサイズ: %zu バイト\n", sizeof(q)); printf("double ポインタのサイズ: %zu バイト\n", sizeof(r)); return 0; }
#include <stdio.h>

int main() {
    int *p;
    char *q;
    double *r;

    printf("int ポインタのサイズ: %zu バイト\n", sizeof(p));
    printf("char ポインタのサイズ: %zu バイト\n", sizeof(q));
    printf("double ポインタのサイズ: %zu バイト\n", sizeof(r));

    return 0;
}

総合例

以下に、ここまで紹介したsizeof演算子の使い方を統合したプログラムを示します。このプログラムは、さまざまなデータ型、配列、構造体、およびポインタのサイズを出力します。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
#include <stdio.h>
struct Person {
char name[50];
int age;
float height;
};
int main() {
// 基本データ型のサイズ
printf("char のサイズ: %zu バイト\n", sizeof(char));
printf("short のサイズ: %zu バイト\n", sizeof(short));
printf("int のサイズ: %zu バイト\n", sizeof(int));
printf("long のサイズ: %zu バイト\n", sizeof(long));
printf("long long のサイズ: %zu バイト\n", sizeof(long long));
printf("float のサイズ: %zu バイト\n", sizeof(float));
printf("double のサイズ: %zu バイト\n", sizeof(double));
printf("long double のサイズ: %zu バイト\n", sizeof(long double));
// 配列のサイズ
int arr[10];
printf("配列arr のサイズ: %zu バイト\n", sizeof(arr));
printf("配列の要素数: %zu\n", sizeof(arr) / sizeof(arr[0]));
// 構造体のサイズ
struct Person person;
printf("構造体Person のサイズ: %zu バイト\n", sizeof(struct Person));
printf("変数person のサイズ: %zu バイト\n", sizeof(person));
// ポインタのサイズ
int *p;
char *q;
double *r;
printf("int ポインタのサイズ: %zu バイト\n", sizeof(p));
printf("char ポインタのサイズ: %zu バイト\n", sizeof(q));
printf("double ポインタのサイズ: %zu バイト\n", sizeof(r));
return 0;
}
#include <stdio.h> struct Person { char name[50]; int age; float height; }; int main() { // 基本データ型のサイズ printf("char のサイズ: %zu バイト\n", sizeof(char)); printf("short のサイズ: %zu バイト\n", sizeof(short)); printf("int のサイズ: %zu バイト\n", sizeof(int)); printf("long のサイズ: %zu バイト\n", sizeof(long)); printf("long long のサイズ: %zu バイト\n", sizeof(long long)); printf("float のサイズ: %zu バイト\n", sizeof(float)); printf("double のサイズ: %zu バイト\n", sizeof(double)); printf("long double のサイズ: %zu バイト\n", sizeof(long double)); // 配列のサイズ int arr[10]; printf("配列arr のサイズ: %zu バイト\n", sizeof(arr)); printf("配列の要素数: %zu\n", sizeof(arr) / sizeof(arr[0])); // 構造体のサイズ struct Person person; printf("構造体Person のサイズ: %zu バイト\n", sizeof(struct Person)); printf("変数person のサイズ: %zu バイト\n", sizeof(person)); // ポインタのサイズ int *p; char *q; double *r; printf("int ポインタのサイズ: %zu バイト\n", sizeof(p)); printf("char ポインタのサイズ: %zu バイト\n", sizeof(q)); printf("double ポインタのサイズ: %zu バイト\n", sizeof(r)); return 0; }
#include <stdio.h>

struct Person {
    char name[50];
    int age;
    float height;
};

int main() {
    // 基本データ型のサイズ
    printf("char のサイズ: %zu バイト\n", sizeof(char));
    printf("short のサイズ: %zu バイト\n", sizeof(short));
    printf("int のサイズ: %zu バイト\n", sizeof(int));
    printf("long のサイズ: %zu バイト\n", sizeof(long));
    printf("long long のサイズ: %zu バイト\n", sizeof(long long));
    printf("float のサイズ: %zu バイト\n", sizeof(float));
    printf("double のサイズ: %zu バイト\n", sizeof(double));
    printf("long double のサイズ: %zu バイト\n", sizeof(long double));

    // 配列のサイズ
    int arr[10];
    printf("配列arr のサイズ: %zu バイト\n", sizeof(arr));
    printf("配列の要素数: %zu\n", sizeof(arr) / sizeof(arr[0]));

    // 構造体のサイズ
    struct Person person;
    printf("構造体Person のサイズ: %zu バイト\n", sizeof(struct Person));
    printf("変数person のサイズ: %zu バイト\n", sizeof(person));

    // ポインタのサイズ
    int *p;
    char *q;
    double *r;
    printf("int ポインタのサイズ: %zu バイト\n", sizeof(p));
    printf("char ポインタのサイズ: %zu バイト\n", sizeof(q));
    printf("double ポインタのサイズ: %zu バイト\n", sizeof(r));

    return 0;
}

結論

sizeof演算子は、メモリ管理やデータ構造の最適化に不可欠なツールです。データ型、配列、構造体、およびポインタのサイズを簡単に取得できるため、効率的なプログラムを作成するのに役立ちます。これらの知識を活用して、より最適化されたCプログラムを作成しましょう。

購読
通知


0 Comments
Inline Feedbacks
View all comments