弦
まず、文字列の定義
文字列はchar型の配列の終わりにヌル文字(\ 0)です。
第二に、プログラムで定義文字列
文字列定数、char型の配列、文字へのポインタ:複数の文字列を定義する方法があります。
2.1文字列定数
また、文字列定数として知られて呼ばれているリテラルの二重引用符文字列、との内容。二重引用符文字とコンパイラが自動的に文字列としてメモリに格納されている\ 0文字の最後に追加します。
文字列定数は、関数に文字列定数を使用する場合、文字列は存在の全体のプロセスの存続期間中、一度だけ格納されていることを示す、静的ストレージ・クラスです。
文字列の内容を二重引用符は、ポイントの保存場所のポインタとみなされています。
2.2初期化文字列配列と
定義文字列は、あなたはコンパイラが必要とされるどのくらいのスペースを知らせなければなりません。
二つの方法:
Ⅰ。ストレージアレイに十分なスペースを使用して文字列。チャーA [50] = "alkdjfaldkfjaldkf"。
Ⅱ。コンパイラは、配列のサイズを決定しましょう。例えば:CHAR A [] = "aldkjfaldkfalkdfj"。
第二の便利な方法が、この方法の初期化文字列は、新しいコンテンツを追加することはできません。
2.3配列とポインタ
文字列配列の宣言:チャーARR [] = "ARRYポインタ。";
ポインタの宣言文字列: "ARRYとポインタ" のconstのchar * PT =;
二つの文、PTとARR上記の文字列のアドレスです。どちらの場合も、引用符で囲まれた文字列自体は、文字列のために確保した記憶領域を決定します。しかし、まだ2種類の方法があります。
**文字列定数は、静的記憶領域に格納され、**しかし、プログラムは、配列に文字列をコピーするので、実行時に、実行時にアレイにメモリを割り当てるであろう。この時点で、文字列の2つのコピーがあり、文字列リテラルは、他の文字列配列ARRの存在で、スタティックメモリです。
そして、ポインタは、このように文字列は、このように一つだけのコピー、文字列の静的なメモリ位置に格納されています。
注:ARRアドレス定数、及びPTはポインタ変数であり、そのため、この操作を行うことができないARR ++、それは次の位置で除去PT ++要素であってもよいです。
例1:
#include <stdio.h>
#define MSG "I'm a const string!"
int main(void)
{
char arr[] = MSG;
char * pt = MSG;
printf("address of MSG is : %p \n", MSG);
//指定字符串与 MSG 内容相同
printf("address of \"I'm a const string!\" is : %p \n", "I'm a const string!");
printf("address of pt is : %p \n", pt);
printf("address of arr is : %p \n", arr);
return 0;
}
/*输出结果:
address of MSG is : 0x400650
address of "I'm a const string!" is : 0x400650
address of pt is : 0x400650
address of arr is : 0x7ffce33adba0
*/
結果:
2つの文字列定数、アドレスのように、同一の文字列定数の記述は(ポリシーコンパイラは、関連取るために)一度だけ格納され、MSGのアドレスをポインタ、説明ポインタは、元の文字列を直接使用することであるように、MSGとARRアドレスは、文字列ARR説明コピーを使用して、同じではありません。
定数CONSTは、文字列データ型として扱われ、したがってCONSTへのポインタであるべきです。つまり:のconstのchar * PT = MSG;
例2:
#include <stdio.h>
#define MSG "I'm a const string!"
int main(void)
{
char arr[] = MSG;
char * pt = MSG;
printf("pt[0] is: %s\n", pt);
printf("pt[1] is: %s\n", ++pt);
printf("arr[0] is: %s\n", arr);
/*输出结果:
pt[0] is: I'm a const string!
pt[1] is: 'm a const string!
arr[0] is: I'm a const string!
*/
printf("arr[1] is: %s\n", ++arr);
/*编译错误:
arr_pt2.c: In function ‘main’:
arr_pt2.c:12:27: error: lvalue required as increment operand
printf("arr[1] is %s\n", ++arr);
*/
return 0;
}
結果:
結果は、そのPTが可変であることを示し、ARR配列名は、一定のアドレスではなく、配列の要素は可変です。
2.4ポインタ配列
#include <stdio.h>
int main(void)
{
int i;
//声明指针数组
const char *ptarry[5] = { "aaaaaaaaaaaa", "bbbbbbbbbbbbb", "ccccccccccccccc", "dddddddddddd", "eeeeeeeeeeee" };
//声明普通数组
char arry[5][40] = { "aaaaaaaaaaaa", "bbbbbbbbbbbbb", "ccccccccccccccc", "dddddddddddd", "eeeeeeeeeeee" };
printf("%-36s %-25s\n", "ptarry", "arry");
for (i = 0; i < 5; i++)
printf("%-36s %-25s\n", ptarry[i], arry[i]);
printf("\n size of ptarry is : %zd, size of arry is %zd", sizeof(ptarry), sizeof(arry));
return 0;
}
/*运行结果
ptarry arry
aaaaaaaaaaaa aaaaaaaaaaaa
bbbbbbbbbbbbb bbbbbbbbbbbbb
ccccccccccccccc ccccccccccccccc
dddddddddddd dddddddddddd
eeeeeeeeeeee eeeeeeeeeeee
size of ptarry is : 40, size of arry is 200
*/
結果:
ptarry 40バイトの大きさ、およびサイズは、このシステムではポインタは8バイト、つまり64ビットを占有するので、それは40 5バイトのポインタを占め、(具体的にはシステムの大きさに関連する)200バイトであるARRY ARRY 5 * 40 = 200バイトつつ。
参考図書
Cプライマープラス(第6版)中国語版