C言語入門(8)--2 D配列とポインタ

3202 ワード

2 D配列の定義:配列内の各要素に2つの下付き文字がある場合、このような配列を2 D配列と呼ぶ.
(論理的に配列を行と列を持つ表または行列と見なす);
構文:
タイプ名グループ名[定数式1][定数式2]
2 D配列の参照:2 D配列要素を参照するには、次のように2つの下付き文字が必要です.
例:
int a[3][4]; 引用:a[0][1]
注意:2つの参照の下付き文字は境界を越えてはいけません.
使用方法はjavaと同じです.
1.2二次元配列の大きさを値付けで定義する
2 D配列では、1番目のかっこの定数式のみを省略でき、2番目の角カッコの定数式を省略することはできません.
int a[][3] = {{1,2},{4,5}};
int a[][3] = {1,2,3,4,5}; --説明:各行は3つの要素で、最初の3つの要素は1行目に、後の2つは2行目に配置されます.まず列の要求を満たすことです.
1.3、2 D配列とポインタの関係と使用!
4、2 D配列とポインタ:2 D配列と配列要素のアドレス:
int *p,a[3][4];
a、2次元配列aは、いくつかの1次元配列からなる.
b、1つのポインタ変数Pのタイプがa[i]と同じである場合、p=a[i]は正しい.
5、二次元配列名もアドレス定数です.
2 D配列名もアドレス定数を格納するポインタであり、その値は2 D配列の最初の要素のアドレスである.
以上:aの値はa[0]の値と同じである.
2 D配列名は行ポインタとして理解されます.
6、二次元配列要素のアドレス:表示方法:&a[i][j]
a[i]+j a[i]--行アドレスjの行の列標
*(a+i)+j a[i]=*(a+i)等価置換
&a[0][0]+4*i=j 
a[0]+4*i+j
7、2次元配列の要素をアドレスで参照する:a[i][j]
*(a[i]+j)
*(*(a+i)+j)
(*(a+i))[j]
*(&a[0][0]+4*i+j)
8、1つのポインタデータを確立することによって2次元配列要素を参照する:int*p[3],a[3][2],i,j;
説明子:*p[3]では、演算子の優先度にも従い、一対の[]の優先度が*号より高いため、pはまず[]と結合し、p[3]を構成し、Pが配列名であることを説明し、システムはそれのために3つの連続した記憶ユニットを開き、その前の*号は配列Pがバッチポインタタイプであることを説明し、その各要素は基本タイプintのポインタである.
例:
for(i=0;i<3;i++)
p[i] = a[i];
これは、各ポインタがa配列の各行の先頭を指すことを意味する.
9、行ポインタを作成することによって2次元配列要素int aを参照する[3][2]、(*prt)[2].
なぜ(*prt)なのか、prtと結合しなければならないので、prtがポインタであることを示します.
次に[2]と組み合わせて、ポインタ変数prtの基本タイプが2つのint要素を含む配列であることを説明する.
10、2 D配列名とポインタ配列を実パラメータとして使用します.
a、2次元配列名を実パラメータとするときの実パラメータと形パラメータとの間のデータ伝達;
2 D配列名が実パラメータである場合、対応するパラメータは行ポインタの変数でなければなりません.
11、ポインタ配列が実パラメータである場合、実パラメータと形パラメータとの間のデータ伝達;
ポインタ配列名が実パラメータである場合、対応するパラメータはポインタを指すポインタであるべきである.
例:
duoble *ps[M]
fun(ps);
則:fun関数のヘッダは以下のいくつかの形式である.
fun(double *a[M]);//
fun(double *a[ ]);//ポインタ配列を受け入れる
fun(double **a);//ポインタを指すポインタ
12、ケース:ランダム関数を呼び出して5*6の二次元配列要素に10-40内の証明書を割り当てる.
各行の要素の平均値を求める.
#include<stdio.h>
#include<stdlib.h>
#define M 6
#define N 5
void getdata(int (*)[M]);
void lineave(int[][M],float *);
void outdata(int[N][M],float *);

main()
{

	int r[N][M];
	float ave[N];
	getdata(r);	//              ,      :   、        、       ;
	lineave(r,ave);
	outdata(r,ave);

	/*
	int a[2][3],i,j;
	printf("enter data by line:
"); for(i=0;i<2;i++) for(j=0;j<3;j++) scanf("%d",&a[i][j]); printf("output a 2-dimension array:
"); for(j=0;j<2;j++) { for(i=0;i<3;i++) { printf("%4d",a[i][j]); } printf("
"); } */ } void getdata(int (*sp)[M]) { int i,j,x; for(i=0;i<N;i++) { j=0; while(j<M) { x = rand()%41; if(x>10) { sp[i][j] = x; j++; } } } } void lineave(int s[][M], float *a) { int i,j,ave; for(i=0;i<N;i++) { ave=0.0; for(j=0;j<M;j++) { ave=ave+s[i][j]; } a[i]=ave/M; } } void outdata(int sp[N][M],float a[]) { int i,j; printf("output the result:
"); for(i=0;i<N;i++) { for(j=0;j<M;j++) { printf("%4d",sp[i][j]); } printf(":%6.2
",a[i]); } putchar('
'); }