第32課配列ポインタとポインタ配列分析
2560 ワード
配列タイプ・C言語における配列には独自の特定のタイプ・配列のタイプがある要素タイプと配列サイズの共通決定例:int array[5]のタイプはint[5]配列タイプを定義・C言語においてtypedefにより配列タイプにtypedef type(name)[size];-配列タイプtypedef int(AINT 5)[5];typedef float(AFLOAT10)[10];-配列定義:AINT 5 iArray;AFLOAT10 fArray;配列ポインタ・配列ポインタ一つの配列を指すために用いられる・配列名は配列の先頭要素の先頭アドレスであるが、配列の先頭アドレスではない・アドレスを取ることによって配列名に作用する配列の先頭アドレスを得ることができる・配列タイプによって配列ポインタArrayType*pointerを定義することができる;直接定義可能:type(*pointer)[n];pointerが配列ポインタ変数名typeが指す配列のタイプnが指す配列のサイズ例32-1である.
`#includetypedef int(AINT5)[5];//AINT 5は配列タイプを表し、5つの要素があり、各要素タイプはinttypedef float(AFLOAT 10)[10];//AFLOAT 10は配列タイプを表し、10個の要素があり、各要素タイプはfloattypedef char(ACHAR 9)[9];//ACHAR 9は配列タイプを表し、9つの要素があり、各要素タイプはcharint main(){
}`出力結果:20,200.000001.0000002.0000003.0000004.0000005.0000006.0000007.0000008.0000009.00000000 EFFDD 8,00 EFFDE 1ポインタ配列・ポインタ配列は通常の配列・ポインタ配列の各要素が1つのポインタ・ポインタ配列である定義:type*pArray[n];
type*配列各要素のタイプpArray配列名n配列サイズ
float a[3]→float
ポインタ配列の適用例32-2:
関数内のすべての配列がポインタstrcmp関数に劣化するのはstring compare(文字列比較)の略で、2つの文字列を比較し、比較結果に基づいて整数を返すために使用されます.基本形式はstrcmp(str 1,str 2)であり、str 1=str 2であればゼロを返す.str 1 str 2であれば、正数`を返す
include "stdio.h"
include "string.h"
define DIM(a) (sizeof(a)/sizeof(*a))
int lookup_keyword(const char key,const char table[],const int size){
}int mian(){
}`出力結果:4,-1
小結:・配列のタイプは要素タイプと配列サイズによって決まる・配列ポインタはポインタであり、対応するタイプの配列を指す・ポインタ配列は配列であり、各要素はポインタ・配列ポインタがポインタ演算法則に従う・ポインタ配列はC言語配列の様々な特性を持つ
`#includetypedef int(AINT5)[5];//AINT 5は配列タイプを表し、5つの要素があり、各要素タイプはinttypedef float(AFLOAT 10)[10];//AFLOAT 10は配列タイプを表し、10個の要素があり、各要素タイプはfloattypedef char(ACHAR 9)[9];//ACHAR 9は配列タイプを表し、9つの要素があり、各要素タイプはcharint main(){
AINT5 a1;
//a1 ,a1 5 , int
float fArray[10];
AFLOAT10* pf = &fArray;
//pf ,
ACHAR9 cArray;
char(*pc)[9] = &cArray;
//char(*pcw)[4] = cArray;
int i = 0;
printf("%d, %d
",sizeof(AINT5), sizeof(a1));
for(i = 0;i < 10; i++)
{
(*pf)[i] = i; //fArray[i] = i;
}
for(i = 0; i < 10; i++)
{
printf("%f
",fArray[i]);
}
printf("%p,%p,%p
",&cArray,pc+1); //pc+1 == (unsigned int)pc + sizeof(cArray) == (unsigned int)pc + 9
return 0;
}`出力結果:20,200.000001.0000002.0000003.0000004.0000005.0000006.0000007.0000008.0000009.00000000 EFFDD 8,00 EFFDE 1ポインタ配列・ポインタ配列は通常の配列・ポインタ配列の各要素が1つのポインタ・ポインタ配列である定義:type*pArray[n];
type*配列各要素のタイプpArray配列名n配列サイズ
float a[3]→float
float*
float*
ポインタ配列の適用例32-2:
関数内のすべての配列がポインタstrcmp関数に劣化するのはstring compare(文字列比較)の略で、2つの文字列を比較し、比較結果に基づいて整数を返すために使用されます.基本形式はstrcmp(str 1,str 2)であり、str 1=str 2であればゼロを返す.str 1 str 2であれば、正数`を返す
include "stdio.h"
include "string.h"
define DIM(a) (sizeof(a)/sizeof(*a))
int lookup_keyword(const char key,const char table[],const int size){
int ret = -1;
int i = 0;
for(i = 0;i < size; i++)
{
if(strcmp(key,table[i]) == 0)
{
ret = i;
break;
}
}
return ret;
}int mian(){
const char* keyword[] = {
"do","for","if","register","return","switch","while","case","static"
};
printf("%d
",lookup_keyword("return",keyword,DIM(keyword)));
printf("%d
",lookup_keyword("main",keyword,DIM(keyword)));
return 0;
}`出力結果:4,-1
小結:・配列のタイプは要素タイプと配列サイズによって決まる・配列ポインタはポインタであり、対応するタイプの配列を指す・ポインタ配列は配列であり、各要素はポインタ・配列ポインタがポインタ演算法則に従う・ポインタ配列はC言語配列の様々な特性を持つ