こんにちは、またお会いしました。たゆまぬ努力と学習の結果、友達のコーディング能力はかなり向上したと思います。この章では、配列について説明します。
- 1 次元配列の作成と初期化。
1.1 配列の作成
配列は、同じ型の要素の集合です。
配列の作成方法
type_t arr_name [const_n];
//type_t 是指数组的元素类型
//const_n 是一个常量表达式,用来指定数组的大小
配列作成のインスタンス
//代码1
int arr1[10];
//代码2
int count = 10;
int arr2[count];//数组时候可以正常创建?
//代码3
char arr3[10];
float arr4[1];
double arr5[20];
上記のコードを見ると、配列の作成には定数を使用する必要があることがわかります。つまり、添字参照演算子 [] は
定数値でなければなりませ
んが、一部のコンパイラでは変数の使用が引き続きサポートされています。
: 配列の作成では、C99 標準以前では、[] 内に定数を指定する必要があり、変数は使用できません。可変長
配列の概念は C99 標準でサポートされています。
- 1.2 配列の初期化
配列の初期化とは、配列の作成時に配列の内容に適切な初期値を与える (初期化) ことを指します。
コードを見てください:
int arr1[10] = {1,2,3}; int arr2[] = {1,2,3,4}; int arr3[5] = {1,2,3,4,5}; char arr4[3] = {'a',98, 'c'}; char arr5[] = {'a','b','c'}; char arr6[] = "abcdef";
一つずつ説明しましょう
int arr1[10] = {1,2,3} は 10 個の整数を格納します。最初の 3 つは 1、2、3 で、その後に 0 が続きます。
int arr2[] = {1,2,3, 4} は 4 つの整数を格納します
int arr3[5] = {1, 2, 3, 4, 5} 5 つの整数を格納
char arr4[3] = {'a',98, 'c'} 3 つの文字を格納
char arr5[] = {'a', 'b','c'} は 3 文字を格納します
char arr6[] = "abcdef" は文字列を格納しますが、これは 7 文字であり、末尾の \0
配列の作成時に、配列の明確なサイズを指定したくない場合は、配列を初期化する必要があります。配列の要素数は初期化内容に応じて決まります。
ただし、次のコードでは、メモリの割り当て方法が区別されます。
char arr1[] = "abc";
char arr2[3] = {
'a','b','c'};
Arr1 は 'a' 'b' 'c' ' \0' です
- 1.3 1 次元配列の使用 配列を使用する
ために、前に演算子 []、添字参照演算子を導入しました。これは実際には配列アクセスのための演算子です。
コードを見てみましょう:
#include <stdio.h>
int main()
{
int arr[10] = {
0};//数组的不完全初始化
//计算数组的元素个数
int sz = sizeof(arr)/sizeof(arr[0]);
//对数组内容赋值,数组是使用下标来访问的,下标从0开始。所以:
int i = 0;//做下标
for(i=0; i<10; i++)
{
arr[i] = i;
}
//输出数组的内容
for(i=0; i<10; ++i)
{
printf("%d ", arr[i]);
}
return 0;
}
配列の添字が0から始まることがわかります。
配列のサイズは、sizeof 演算子を使用して計算できます。
int arr[10];
int sz = sizeof(arr)/sizeof(arr[0]);
- 1.4 メモリ内での 1 次元配列の保存
次に、メモリ内での配列の保存について説明します。
コードを見てください:
#include <stdio.h>
int main()
{
int arr[10] = {
0};
int i = 0;
int sz = sizeof(arr)/sizeof(arr[0]);
for(i=0; i<sz; i++)
{
printf("&arr[%d] = %p\n", i, &arr[i]);//%p打印的是指针变量的地址
}
return 0;
}
観察すると、アドレスは 16 進数であり、前と後ろのアドレスの差は 4 バイトで、たまたま int であることがわかり、また、格納処理中に配列が継続的に格納されていることがわかります。
2 2次元配列の作成と初期化
- 2.1 2次元配列の作成
//数组创建
int arr[3][4];
char arr[3][5];
double arr[2][4];
最初のものは行を意味し、2 つ目は列を意味します。最初のものは
int arr[3][4];
3 行 4 列の int 型を表します。3
行 4 列であるかのように見ないでください。実際には、まだそのままです。最初のような連続配列 1 行の 4 列目と 2 行目の 1 列目の間には、まだ 4 バイトの差があります
- 2.2 2次元配列の初期化
//数组初始化
int arr[3][4] = {
1,2,3,4};
int arr[3][4] = {
{
1,2},{
4,5}};
int arr[][4] = {
{
2,3},{
4,5}};//二维数组如果有初始化,行可以省略,列不能省略
- 2.3 2 次元配列の使用
2 次元配列は添え字によっても使用できます。
コードを見てください
#include <stdio.h>
int main()
{
int arr[3][4] = {
0 };
int i = 0;
for (i = 0; i < 3; i++)//每一行
{
int j = 0;
for (j = 0; j < 4; j++)//每一列
{
arr[i][j] = i * 4 + j;//每一行,每一列开始放数
//按顺序放从0开始
}
}
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 4; j++)
{
printf("%d ", arr[i][j]);
}
}
return 0;
}
上記のコードでは、0から11までを配列に格納し、順番に出力しています。
- 2.4 メモリへの 2 次元配列の保存
1D 配列と同様に、ここでも 2D 配列の各要素を出力してみます。
#include <stdio.h>
int main()
{
int arr[3][4];
int i = 0;
for(i=0; i<3; i++)
{
int j = 0;
for(j=0; j<4; j++)
{
printf("&arr[%d][%d] = %p\n", i, j,&arr[i][j]);
}
}
return 0;
}
配列も連続して格納されており、2 次元配列の各要素にも 4 バイトの差があることがわかります。もちろん、これは int に関連しています。また、配列には添字を使用してアクセスできることもわかります。次元配列の添字はすべて 0 から始まります。
配列が範囲外です
配列の添え字は範囲が制限されています。
配列の添字は 0 から始まります。配列に n 個の要素がある場合、最後の要素の添字は n-1 になります。
したがって、配列の添字が 0 より小さいか、n-1 より大きい場合は、配列が範囲外にアクセスされ、アクセスが配列の有効な領域を超えていることを意味します。
C 言語自体は配列添字の範囲外チェックを実行せず、コンパイラーが必ずしもエラーを報告するわけではありませんが、コンパイラーがエラーを報告しないという事実は、プログラムが正しいことを意味するわけではありません。プログラマーは
コードを書くので、自分でチェックするのが最善です
#include <stdio.h>
int main()
{
int arr[10] = {
1,2,3,4,5,6,7,8,9,10};
int i = 0;
for(i=0; i<=10; i++)
{
printf("%d\n", arr[i]);//当i等于10的时候,越界访问了
}
return 0;
}
配列の添字は 0 から始まるため、0 ~ 9 はちょうど 10 個の数字であり、添字が 10 の場合は 11 番目の数字となるため、範囲外になります。
次にバブル ソートについて説明しますが、その前に、配列名について理解する必要があります。
3 配列名とは何ですか? ?
次のコードを見てみましょう
#include <stdio.h>
int main()
{
int arr[10] = {
1,2,3,4,5};
printf("%p\n", arr);
printf("%p\n", &arr[0]);
printf("%d\n", *arr);
//输出结果
return 0;
}
* は逆参照演算子で、内容を取り出すのと同じです。このように理解できます。記号 & の逆です。ここで演算子の結論を説明します。配列名はアドレスです最初の要素の ですが、そうでない例が 2 つあります
。どちらも演算子で、1 つは sizeof で、もう 1 つは & です。
sizeof で計算されたバイト サイズが依然として配列全体のサイズであることがわかります。
しかし、次のことからわかるように、アドレスを取得するということは、最初の文字のアドレスも取得することになると思うかもしれません。
#include<stdio.h>
int main()
{
int arr[] = {
1,2,3,4,5,6,7,8,9,10 };
printf("%p\n", arr);
printf("%p\n", arr+1);
printf("%p\n", &arr);
printf("%p\n", &arr+1);
return 0;
}
このようにして、アドレス記号 + 1 を取得せずにスキップされたものは整数ですが、(&) 記号を使用してスキップされたものは 10 個の整数であることがわかります。したがって、& 記号はアドレス全体です
4 バブルソート
小さいものから大きいものへのバブル ソートを実装したいのですが、まずバブリングとは何か、そしてバブリングとは隣接する要素を比較することであることを知る必要があります。最初のものが 2 番目のものより大きい場合は、両方を交換します。
隣接する要素の各ペアに対して、最初の最初のペアから最後の最後のペアまで同じことを行います。このステップが完了すると、最後の要素が最大の数値になります。
最後の要素を除くすべての要素に対して上記の手順を繰り返します。
比較する数値のペアがなくなるまで、要素の数を減らしながら上記の手順を繰り返します。
#include <stdio.h>
void mao_pao(int arr[], int sz)
{
int i = 0;
for (i = 0; i < sz - 1; i++)
{
int flag = 1;
int j = 0;
for (j = 0; j < sz - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
flag = 0;
}
}
if (flag)//如果j的那个循环一次也没执行,就退出
{
break;
}
}
}
int main()
{
int arr[] = {
10,9,8,7,6,5,4,3,2,1 };
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
mao_pao(arr, sz);
//打印
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
これは単純なバブル ソートです。バブル ソートだけでなく、後で説明する選択ソートも行います。
今日の共有はこれで終わりです。編集者をサポートするために「いいね!」を残していただけますか。ありがとうございます。