文字のVSの文字ポインタの配列

実験データ構造の最近のレビューは、少し不快探して、コードのように行に遭遇しました。

typedef char** HuffmanCode;

これによって櫛アレイとポインタ。

int* p; //指针变量p中存的地址代表的内存单元中的数据是整型

32ビットプラットフォームでは、p個のアドレスが格納されているので、そうpの値は、32ビットです。
関係なくPによって指されるデータの種類の、ポインタ変数pは整数自体です。

Cありませんstringタイプは、それは一般的に、文字列の配列によって表されます。

char str[15] = "Hello World";

指定するC配列名は、メモリアレイ内の最初のアドレスを示しstr = &str[0]、ときに我々一般的に出力文字列printf("%s",str);、あなたは出力文字列全体を可能な第1のアドレスを。

あなたは、Cでそれを行うことができます。

 char *s;
 s = "Hello";

ポインタ変数に割り当てられた文字列?

実際には、Cコンパイラは、と仮定して、文字列定数のためのメモリを割り当てます"Hello"アドレスは0x0000000000404000 0x0000000000404001 0x0000000000404002 0x0000000000404003 0x0000000000404004 0x0000000000404005(私は64ビット環境午前)、
実際にはs = "Hello" = 0x0000000000404000イニシャルとしてこの文字列に対処するために、Cコンパイラ。

テストであるために:

printf("%s\n",s);
printf("%s\n",0x0000000000404000);
这两行的效果是一样的。
char str[10];
char* s;

str最初のアドレスを表し、sだけでなく、最初のアドレスの保存、それをすることができます:

s = str;
但是不可以 str = s;

配列名を割り当てることができない一定であるため。
実際には、char str[10]コンパイラは、メモリ部10を割り当てるが、char* sポインタ変数の定義のみ、唯一の4バイトは、文字列の先頭アドレスを格納するために使用される32ビット環境を割り当てます。

テストを信じてはいけません。

sizeof(str) = 10;
sizeof(s) = 4;   //分配四个字节来保存地址

だから、配列名とポインタ変数は、本質的に異なっています。

次は、私たちは見てchar**与char* a[]
のためにchar* a[]、実質的にまたは配列、配列要素が保存されている、char*タイプ、char*変数のアドレスを保持しています。

だから、それはすることができます。

char* a[] = {"me","you","him"};

この場合、32ビット環境sizeof(a) = 12、三つの要素はであるためchar*、ポインタ、ポインタ変数が4バイトです。
あなたは上でプリントアウトすることができます。

printf("%p %p %p\n",a[0],a[1],a[2]);
printf("%p %p %p\n",&a[0],&a[1],&a[2]);

ここに画像を挿入説明
3アレイ素子は、第1の3つの文字列のアドレスである3つのアドレスを保持しています。

char** s
2ポインタ変数のポインタのセーブchar*アドレス、我々は次のことができます。

s = a;

アレイ名a=&a[0]=62FE30、およびこのアドレス(すなわち、A [0])に格納され404000た文字列であるアドレス、"me"最初のアドレス、即ち:

*s = 404000 = "me";

エラーが発生しやすいポイント1:

char** s = "Hello";

sがあるので、これは、間違っているchar**、と「こんにちは」ですchar*
そこアドレスであるが、アドレス「こんにちは」のコンテンツがHで表されるが、char型、
Sに格納されたアドレスの内容を(*s)であるchar*タイプ、ポインタタイプ。

エラーが発生しやすいポイント2:

char** s;
*s = "Hello";

そのためには、コンパイラが間違っていることはできませんが、実行時には、printf("%s",*s);崩壊します。

想定s=0x1000では、0x1000メモリユニットのメモリ「こんにちは」のアドレスで0x2000はありません、*s = 0x2000この最初の発見の実装、0x1000そして、0x2000全く問題。

しかしchar** s;、メモリがフィールドガイドでランダムなアドレスであり、sは、*sそれがクラッシュすることがあります。

あなたは、最初のアドレスを割り当てる必要があります。

char** s;
s = (char**) malloc(sizeof(char**));
*s = "Hello";

だから、利用可能なアドレスがありますよ。

参考:
https://blog.csdn.net/liusicheng2008_liu/article/details/80412586

おすすめ

転載: www.cnblogs.com/EIMadrigal/p/12130794.html