まず、配列はポインターではありません。ポインターは配列ではありません。配列はポインターに崩壊します。
1.How both the address is same of s and &s?
char s[]="prady";
--------------------------
s: | p | r | a | d | y | \0 |
--------------------------
配列s
は、6 文字を確保するための要求です。つまり、s
文字数は 6 です。's` は「もの」であり、何も指していません。
char *ptr = "prady";
------ --------------------------
|*ptr| --> | p | r | a | d | y | \0 |
------ --------------------------
ポインターptr
は、ポインターを保持する場所を要求します。ポインターは、任意の char または任意の文字列リテラル (連続した文字) を指すことができます。
これについて考える別の方法:
int b; //this is integer type
&b; //this is the address of the int b, right?
int c[]; //this is the array of ints
&c; //this would be the address of the array, right?
したがって、これについてはかなり理解できます。
*c; //that's the first element in the array
そのコード行は何を教えてくれますか? c を参照すると、int が得られます。つまり、単純な c はアドレスです。これは配列の先頭であるため、配列のアドレスです。したがって、次のようになります。
c == &c;
2. If both are same then how they show different when adding 1 to it.
#1への私の答えから、なぜそれらが同じではないのかがわかると思います。では、なぜ異なる値が得られるのでしょうか。得られた値を見てください。
s = 0x3217062327
s+1 = 0x3217062328 // It's 1 bigger, why? Because a char takes 1 byte, s holds chars
// so s (address of a char) + 1 (sizeof char) gives you one more than s
&a + 1 //This is adding 1 (sizeof array) which is bigger than the size of a char
3. How I got segmentation fault in *p.
これは、前の2つの回答から得られると思います...しかし:
- p は文字へのポインタへのポインタです
- p を配列のアドレスに設定します (覚えているのは配列自体です)。
- p の参照は char (別のアドレス) へのポインタですが、配列に対してはできません。
型キャストすると、コンパイラに「私はあなたよりもよく知っているので、これら2つを機能させるだけです」と伝えます。あなたがセグメンテーション違反をしたとき...それはあなたが本当によく知らなかったからです。