C言語知識点(四)---配列
7857 ワード
配列の基本概念
•要素タイプ角度:配列は同じ種類の変数の規則的な集合である•メモリ角度:連続した大きなメモリ領域
配列名
配列ヘッダ要素のアドレスと配列アドレスは、2つの異なる概念配列名が配列ヘッダ要素を表すアドレスであり、定数である.変数の本質はメモリ空間の別名であり,配列を定義するとメモリが割り当てられ,メモリが固定される.だから配列名を付けてからは修正できません.配列ヘッダのアドレスと配列のアドレス値が等しい
int a[10]というデータ型をどのように表現しますか?
配列タイプ
配列のタイプは、要素タイプと配列サイズで決まります.
ポインタ配列
ポインタ配列は、配列で、中の各要素はポインタです.(複数のポインタ)
アレイポインタ
ケース:
多次元配列の表現形式
パラメトリックがポインタに劣化した原因1:高効率原因2:C言語でa[n]を処理する場合、nが何であるかを知ることができず、&n[0]がどれだけであるかしか知らず、その値がパラメータとして伝達され、c言語は直接int fun(char a[20])を行うことができ、関数は20という数字を得ることができるが、Cはそうしなかった.
•要素タイプ角度:配列は同じ種類の変数の規則的な集合である•メモリ角度:連続した大きなメモリ領域
配列名
配列ヘッダ要素のアドレスと配列アドレスは、2つの異なる概念配列名が配列ヘッダ要素を表すアドレスであり、定数である.変数の本質はメモリ空間の別名であり,配列を定義するとメモリが割り当てられ,メモリが固定される.だから配列名を付けてからは修正できません.配列ヘッダのアドレスと配列のアドレス値が等しい
int a[10];
printf(" a: %d
", &a);
printf(" a: %d
", a);
int a[10]というデータ型をどのように表現しますか?
配列タイプ
配列のタイプは、要素タイプと配列サイズで決まります.
int array[5] int[5];
#include
/*
typedef int(MYINT5)[5];
typedef float(MYFLOAT10)[10];
:
MYINT5 iArray; int iArray[5];
MYFLOAT10 fArray; float fArray[10];
*/
/* , */
int main(void)
{
typedef int(MYINT5)[5];
int i = 0;
MYINT5 array;
for (i=0; i<5; i++)
{
array[i] = i;
}
for (i=0; i<5; i++)
{
printf("%d ", array[i]);
}
return 0;
}
ポインタ配列
char *point_array[4];
ポインタ配列は、配列で、中の各要素はポインタです.(複数のポインタ)
アレイポインタ
int (*array_point)[4];
, 。( )
ケース:
#include
int main(int)
{
int a[3][5], i=0, j=0;
// a ?
printf("a %d , a+1:%d ", a, a+1);
//a+1 20 5*4
printf("&a %d , &a+1:%d ", &a, &a+1);
//&+1 5*4*3 = 60
//
//
//
int (*pArray)[5] ; // 4 32bit
pArray = a;
for (i=0; i<3; i++)
{
for (j=0; j<5; j++)
{
printf("%d ", pArray[i][j]);
}
}
// (a+i) i
// *(a+i) 1 i
// *(a+i) + j ===> & (a[i][j])
//*( *(a+i) + j) ===> a[i][j]
return 0;
}
多次元配列の表現形式
#include
void printArray01(int a[3][5])
{
int i, j;
for (i=0; i<3; i++)
{
for (j=0; j<5; j++)
{
printf("%d ", a[i][j]);
}
}
}
void printArray02(int a[][5])
{
int i, j;
for (i=0; i<3; i++)
{
for (j=0; j<5; j++)
{
printf("%d ", a[i][j]);
}
}
}
void printArray03( int (*b)[5])
{
int i, j;
for (i=0; i<3; i++)
{
for (j=0; j<5; j++)
{
printf("%d ", b[i][j]);
}
}
}
int main(void)
{
int a[3][5], i=0, j=0;
int tmp = 1;
for (i=0; i<3; i++)
{
for (j=0; j<5; j++)
{
a[i][j] = tmp++;
}
}
printArray03(a);
return 0;
}
パラメトリックがポインタに劣化した原因1:高効率原因2:C言語でa[n]を処理する場合、nが何であるかを知ることができず、&n[0]がどれだけであるかしか知らず、その値がパラメータとして伝達され、c言語は直接int fun(char a[20])を行うことができ、関数は20という数字を得ることができるが、Cはそうしなかった.