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