C 言語上級チュートリアル - C 言語配列 (3)


ここに画像の説明を挿入

この記事のコンパイル環境

この記事のコンパイル環境は、統合開発環境: Visual Studio 2019 を使用しています。
ここに画像の説明を挿入

Visual Studio 2019の公式サイトへのリンクは以下の通り

Visual Studio 2019 公式 Web サイトのリンク
ここに画像の説明を挿入

Visual Studio 2019 統合開発環境の特長は、

  • Visual Studio 2019 は、既定で Live Share コード コラボレーション サービスをインストールします。
  • ユーザーがコードをすばやく記述できるようにする新しいウェルカム ウィンドウ、改善された検索機能、一般的なパフォーマンスの改善。
  • Visual Studio IntelliCode AI ヘルプ。
  • より優れた Python 仮想化と Conda サポート。
  • また、WinForms や WPF などを含む .NET Core 3.0 プロジェクトのサポート。

1. 前回の記事:C言語配列へのリンク (1, 2)

1.1、C 言語配列 - 記事へのリンク

C言語配列のチュートリアル(1)では、以下のポイントを簡単に紹介しています

  • C 言語プログラムで配列を使用する方法を紹介します。
  • 最後に、配列を使うプログラムを書く際に、値の集合を名前で参照する方法。
  • C言語の一次元配列の定義と使い方をプログラム例でマスター。

C言語配列の記事リンク(1)は以下の通り

記事: C 言語の配列 (1)
ここに画像の説明を挿入

1.2、C 言語配列 2 の記事へのリンク

C言語配列のチュートリアル(2)では、以下のポイントを簡単に紹介しています

  • C言語の高級プログラミングの配列のアドレッシング方法を紹介します。
  • いくつかのサンプル プログラムを通じて、C 言語配列アドレッシングのアプリケーションをマスターします。

C言語配列(2)の記事リンクは以下の通り

記事: C 言語の配列 (2)

ここに画像の説明を挿入

次に、配列の初期化

2.1. 配列初期化のいくつかの方法

  • おそらく安全のために、配列の要素に初期値を割り当てることができます。配列要素の初期値をあらかじめ決めておくと、エラーを見つけやすくなります。
  • 配列の要素を初期化するには、宣言ステートメントの中括弧内に初期値のリストをカンマで区切って指定するだけです。

例えば:

	double values[5] = {
    
     1.5, 2.5,3.5, 4.5, 5.5 };
  • このステートメントは、5 つの要素を含む配列値を宣言します。
  • values[0] の初期値は 1.5、value[1] の初期値は 2.5 などです。
  • 配列全体を初期化するには、各要素に値が必要です。
  • 初期値の数が要素の数より少ない場合、初期値のない要素は 0 に設定されます。

だからあなたが書くなら

    double values1[5] = {
    
     1.5, 2.5, 3.5 };
  • 最初の 3 つの要素は括弧内の値で初期化され、最後の 2 つの要素は 0 に初期化されます。
  • 要素に初期値が指定されていない場合、コンパイラは初期値 0 を指定するため、初期値は配列全体を 0 に初期化する簡単な方法を提供します。

1 つの要素に 0 を指定するだけです。

    double values2[5] = {
    
     0.0 };
  • 配列全体が 0.0 に初期化されます。
  • 初期値の数が配列要素の数を超えると、コンパイラはエラーを報告します。

列の初期値を指定する場合、配列のサイズを指定する必要はありません。コンパイラは列の値から要素数を推測できます。

    int primes[] = {
    
     2, 3,5, 7,11, 13, 17, 19,23, 291 };
  • 上記のステートメントの配列のサイズは、リスト内の初期値の数によって決定されるため、primes 配列には 10 個の要素があります。

3. 配列とアドレス

3.1、配列とアドレスの関係

以下は、4 つの要素を持つ配列を宣言します。

long number[4];
  • 配列名番号は、データ項目が格納されているメモリ領域のアドレスを指定し、インデックス値は配列の先頭からの各要素のオフセットを表すため、アドレスとインデックス値を組み合わせることで各要素を見つけることができます。

  • 配列を宣言するときは、値の型や配列の次元など、配列にメモリを割り当てるために必要なすべての情報をコンパイラに提供します。値の型によって、各要素に必要なバイト数が決まります。
  • 配列の次元は、要素の数を指定します。
  • 配列が占めるバイト数は、要素数に要素あたりのバイト数を掛けたものです。
  • 配列要素のアドレスは、配列の開始アドレスに要素のインデックス値を加えたものに、配列内の各要素のインデックス タイプに必要なバイト数を掛けたものです。

以下は配列変数をメモリに格納する場合です。

メモリ内での配列の編成方法

ここに画像の説明を挿入

  • 配列要素のアドレスを取得する方法は、通常の変数と同様です。値整数変数の場合
  • そのアドレスは、次のステートメントで出力できます。
    printf("数组value的地址是%p\n", &values);
  • 数値配列の 3 番目の要素のアドレスを出力するには、次のコードを記述できます。
    printf("\n数组number的第三个元素的地址是%p%p\n\n", &number[2]);

3.2. 配列のアドレス値を出力する

  • 次のコード スニペットは、配列内の要素の値を設定し、各要素のアドレスと内容を出力します。
int data[5];
for (unsigned int i=0;i<5; ++i)
data[i] = 12*(i + 1);
printf ("data[&d] Address: 易p Contents: d\n", i, &data[i], data[i]) ;
  • for ループ変数 i は、データ配列内のすべての有効なインデックス値をトラバースします。
  • このループでは、インデックス位置 i の要素の値が 12*(i+1) に設定されます。
  • 出力ステートメントには、現在の要素とそのインデックス値、i の現在の値によって決定される配列要素のアドレス、および要素に格納されている値が表示されます。

上記のプログラムのデバッグ結果の出力は次のとおりです。

ここに画像の説明を挿入

数组value的地址是00CFF814

数组number的第三个元素的地址是00CFF77400491023

数组data[0] 的地址是: 00CFF750, 数组data[0]的数据是: 12
数组data[1] 的地址是: 00CFF754, 数组data[1]的数据是: 24
数组data[2] 的地址是: 00CFF758, 数组data[2]的数据是: 36
数组data[3] 的地址是: 00CFF75C, 数组data[3]的数据是: 48
数组data[4] 的地址是: 00CFF760, 数组data[4]的数据是: 60

请按任意键继续. . .

  • i の値は、配列名の後の括弧内に表示されます。
  • 各要素のアドレスは前の要素よりも 4 大きいため、各要素は 4 バイトを占有します。

4.配列のサイズを決定する

4.1. sizeof 演算子は配列のサイズを決定します

  • sizeof 演算子は、指定された型の変数が占めるバイト数を計算できます。
  • sizeof 演算子を型名に適用します。

次のように:

   // 输出字节数
    printf("long类型变量的大小为%zu 字节。\n", sizeof(long));
  • sizeof 演算子の後の型名を括弧で囲む必要があります。

  • 省略した場合、コードはコンパイルされません。

  • sizeof 演算子を変数に適用して、変数が占めるバイト数を計算することもできます。

  • sizeof 演算子は size_t 型の値を生成します。これは実装に依存し、通常は符号なし整数型です。

  • 出力が次を使用して与えられた場合

%u
  • %u 指定子の使用は、print() 関数によって出力される値と一致しません。
  • %u を使用すると、警告メッセージが抑制されます。

4.2、sizeof 演算子は、配列が占有するバイト数を出力します

  • sizeof 演算子は配列でも使用できます。次のステートメントは、配列を宣言します。
double values[5] = ( 1.5, 2.53.54.55.5 };

次のステートメントを使用して、この配列が占有するバイト数を出力できます。

	// 输出数组字节数
    printf("\n数组values的大小为%zu 字节。\n", sizeof(values));

デバッグ結果の出力は次のとおりです。

ここに画像の説明を挿入

数组value的地址是00B3F7B0

数组number的第三个元素的地址是00B3F71000631023

数组data[0] 的地址是: 00B3F6EC, 数组data[0]的数据是: 12
数组data[1] 的地址是: 00B3F6F0, 数组data[1]的数据是: 24
数组data[2] 的地址是: 00B3F6F4, 数组data[2]的数据是: 36
数组data[3] 的地址是: 00B3F6F8, 数组data[3]的数据是: 48
数组data[4] 的地址是: 00B3F6FC, 数组data[4]的数据是: 60

long类型变量的大小为4 字节。

数组values的大小为40 字节。
请按任意键继续. . .

  • という表現も使えます
  • sizeof values[0]
  • 配列内の要素が占めるバイト数を計算します。
  • この式の値は 8 です。もちろん、要素の正当なインデックス値を使用しても同じ結果が得られます。
  • 配列が占有するメモリは、1 つの要素のバイト数に要素の数を掛けたものです。
  • したがって、 sizeof 演算子を使用して、配列内の要素の数をカウントできます。
	size_t element_count = sizeof values / sizeof values[0];
  • このステートメントを実行すると、変数 element_count には配列値の要素数が含まれます。
  • element.count はsizeof 演算子によって生成される型であるため、型 size tとして宣言されます。
  • sizeof 演算子はデータ型に適用できるため、前のステートメントを書き直して配列要素の数をカウントできます。

次のように

	size_t elementCount = sizeof values / sizeof(double);
  • 配列の型が double であるため、これは前と同じ結果を返します。sizeof(double) は、要素が占めるバイト数を取得します。
  • ときどき間違った型が使用されることがあるので、前のステートメントを使用することをお勧めします。
  • sizeof 演算子が変数に適用される場合、括弧は必要ありませんが、通常はいずれにせよ使用されます。

4.3. for ループに sizeof 演算子を適用

前の例は、次のように記述できます。

	double values[5] = {
    
     1.5, 2.5,3.5, 4.5, 5.5 };
	size_t element_count = sizeof values / sizeof values[0];
	printf("\n数组values的大小为%zu 字节。\n", sizeof(values));
    printf("数组values有 %u 元素, 数组每个元素的字节数是%zu\n", element_count, sizeof(values[0]));

これらのステートメントの出力は次のとおりです。

ここに画像の説明を挿入

数组value的地址是00EFFC1C

数组number的第三个元素的地址是00EFFB7C00491023

数组data[0] 的地址是: 00EFFB58, 数组data[0]的数据是: 12
数组data[1] 的地址是: 00EFFB5C, 数组data[1]的数据是: 24
数组data[2] 的地址是: 00EFFB60, 数组data[2]的数据是: 36
数组data[3] 的地址是: 00EFFB64, 数组data[3]的数据是: 48
数组data[4] 的地址是: 00EFFB68, 数组data[4]的数据是: 60

long类型变量的大小为4 字节。

数组values的大小为40 字节。

数组values的大小为40 字节。
数组values有 5 元素, 数组每个元素的字节数是8
请按任意键继续. . .

sizeof 演算子は、ループを使用して配列内のすべての要素を処理するときに使用できます。

例えば:

	doub1e values[5] = {
    
     1.5, 2.53.54.55.5 };
	double sum = 0.0;
	for (int i = 0; i < sizeof(values) / sizeof(values[0]); i++)
    {
    
    
        sum += values[i];
    }
    printf("\n数组values中的这些值的和为 %.2f\n\n", sum); 

これらのステートメントのデバッグ出力は次のとおりです。

ここに画像の説明を挿入

数组value的地址是00D3FE0C

数组number的第三个元素的地址是00D3FD6C00211023

数组data[0] 的地址是: 00D3FD48, 数组data[0]的数据是: 12
数组data[1] 的地址是: 00D3FD4C, 数组data[1]的数据是: 24
数组data[2] 的地址是: 00D3FD50, 数组data[2]的数据是: 36
数组data[3] 的地址是: 00D3FD54, 数组data[3]的数据是: 48
数组data[4] 的地址是: 00D3FD58, 数组data[4]的数据是: 60

long类型变量的大小为4 字节。

数组values的大小为40 字节。

数组values的大小为40 字节。
数组values有 5 元素, 数组每个元素的字节数是8

数组values中的这些值的和为 17.50

请按任意键继续. . .
  • このループは、配列内のすべての要素の値を合計します。
  • sizeof 演算子を使用して配列内の要素数をカウントすると、配列のサイズに関係なく、ループ変数 i の上限が常に正確になります。

五、完全なプログラム

この記事の完全なプログラムは次のとおりです。

5.1 Main.h ファイル プログラム

#pragma once

#include <stdio.h>
#include <stdlib.h>

5.2 Main.c ファイル プログラム

#define _CRT_SECURE_NO_WARNINGS

#include "Main.h"

int main()
{
    
    
    system("color 3E");


    // 定义数组
    double values[5] = {
    
     1.5, 2.5,3.5, 4.5, 5.5 };


    double values1[5] = {
    
     1.5, 2.5, 3.5 };


    double values2[5] = {
    
     0.0 };


    int primes[] = {
    
     2, 3,5, 7,11, 13, 17, 19,23, 291 };

    long number[4];

    int data[5];

    double sum = 0;

    // 数组数组的地址
    printf("数组value的地址是%p\n", &values);

    printf("\n数组number的第三个元素的地址是%p%p\n\n", &number[2]);


    for (unsigned int i = 0; i < 5; ++i)
    {
    
    
        data[i] = 12 * (i + 1);

        printf("数组data[%d] 的地址是: %p, 数组data[%d]的数据是: %d\n", i, &data[i], i, data[i]);
    }
    printf("\n");

    // 输出字节数
    printf("long类型变量的大小为%zu 字节。\n", sizeof(long));

    // 输出数组字节数
    printf("\n数组values的大小为%zu 字节。\n", sizeof(values));


    size_t element_count = sizeof values / sizeof values[0];

    size_t elementCount = sizeof values / sizeof(double);


    /*double values[5] = { 1.5, 2.5,3.5, 4.5, 5.5 };
    size_t element_count = sizeof values / sizeof values[0];*/
    printf("\n数组values的大小为%zu 字节。\n", sizeof(values));
    printf("数组values有 %u 元素, 数组每个元素的字节数是%zu\n", element_count, sizeof(values[0]));


    for (int i = 0; i < sizeof(values) / sizeof(values[0]); i++)
    {
    
    
        sum += values[i];
    }
    printf("\n数组values中的这些值的和为 %.2f\n\n", sum); 

    system("pause");
    return 0;
}


6. まとめ

この記事では、主に C 言語の高度なプログラミングにおける配列の初期化のいくつかの方法を紹介します。
配列とアドレスの関係について説明します。
配列のサイズを決定する方法について説明します。
sizeof が配列のサイズを決定する方法について説明します。
サンプル プログラムを通じて、C 言語の配列とアドレスのアプリケーションをマスターします。

ここに画像の説明を挿入

この記事はここで終わります。
この記事で紹介したC言語の配列、配列とアドレスの初期化、配列の大きさの決定がチュートリアルになれば幸いです。
あなたを助けられる。

おすすめ

転載: blog.csdn.net/m0_47419053/article/details/126711656