c言語における文字ポインタと文字配列の違い:

1662 ワード

charは単一の文字を格納するために使用されます.
例:
char ch=’a’;

char[]は、複数の文字を格納するために使用される.
例:
char ch[5]={‘h’, ‘e’, ‘l’, ‘l’, ‘o’};

//配列は本質的に複数の変数を同時に定義し、変数を初期化する
char[]の最後の文字が「0」の場合、これは文字列です.
例:
char ch[6]={‘h’, ‘e’, ‘l’, ‘l’, ‘o’, ‘\0’};

文字列は次のように書くこともできます.
char ch[6]=”hello”;// char ch[]=”hello”;//      ,        
char ch1[]=”world”;//      ,       
char *ch2=”hello world”;//      ,          const char *ch =”hello world”; 

注:ch 2はローカルポインタ変数であり、スタックに格納され、「helloworld」は定数領域に格納されます.しかし,ch,ch 1およびその中の配列,hello,worldはいずれもスタックに格納されている.
//char*文字ポインタはint*に比べて形式的に多くなっています.
1)
int* i=&j;//        ;
char ch[]=”hello world”;//ch            
char* p=ch;//               h
*p =’T’//     ,      p          

//char*とint*の同じ場所です.
2)
char* ch=”hello world”;

//char*は文字列定数を直接割り当てることもできます!!!これとint*の違い.
//実質的に「helloworld」は、文字列定数そのものではなくアドレスを返します. 
文字列配列を初期化する方法は2つあります.
1)定義時に直接初期化:
char ch[]=”hello”;

2)文字配列を用いたコピー関数
char* strcpy(char *dst, const char *src);
char ch[6];
char *p=”hello”;
strcpy(ch,p);

注意:dstは既に申請されたメモリユニットであり、十分な修正可能なメモリ領域であり、src内の文字個数を盛る必要があり、定数を指す文字列定数ではないため、文字配列char ch[6]であってもよい.newのメモリでも
char *ch= new char[6];

でもできない
char *ch;
strcpy(ch,p);//     !!!!  

まとめ:
1)文字ポインタは文字列を指すことも、ある文字変数を指すこともできる.
2)文字配列名は定数であるため、配列名は++できない.文字ポインタは変数なので、ポインタは++できます.
文字配列は変数の集合であるため、文字配列要素は++であってもよい.文字ポインタは文字列定数を指し、定数は++できないため、*p++はエラーです.