2017-06-15 5 views
-3
int main(int argc, char *argv[]) 
{ 
    int *p=5,**P; 
    printf("%d",&P); 
} 

* pと** Pの違いは何ですか?両方のポインタの違いは何ですか?

+0

'p'小文字と' P'大文字を使用していますか?うん、それは読み込み可能で、混乱は全くありません。 – bolov

+0

値5のint変数へのポインタを宣言したい場合は、 'int x = 5; int * px =&x; 'その後、正しい書式指定子 'printf("%p "、px);'を使用してそのメモリアドレスを印刷することができます。 –

+0

'int * p = 5'では' int * '(またはintへのポインタ)型の変数' p'を宣言し、その中に何が入っていても(おそらくintではなく)、メモリアドレス '5'をpに代入します。 int型の変数のアドレスは5です。これは[悪いアイデア](https://ideone.com/2H0adX)です。 –

答えて

1

* pが5

に等しい整数** Pを指すポインタは、ポインタへのポインタである;それはアドレスを含む変数です。

ポインタは、アドレスを含む変数です。あなたのPCでは、すべての変数はそのメモリ内の特定の場所に格納されています。変数が配置されている正確な場所は、変数のアドレスと呼ばれます。

ポインタを使用すると、別の変数の正確なアドレスを知ることができます。

int c = 5; // this value of this int is stored at a certain address; 
int *p = &c; // the pointer p now contains the address where 5 

pはあまりにもそのように変数であるだけでなく、メモリのどこかに保存されている*ことに注意してください。

int **P = &p ; // a double pointer that contains the address of the pointer p 

これは、pが格納されているアドレスを指す新しいポインタになります(変数cではなく)。

+0

あなたはポインタにポインタが何であるかを教えてもいいですか?...それは1つのアドレスの新しいアドレスです –

+0

チップをありがとう! 私の答えを編集しました;) – Eduard6421

0

1つのアスタリスクはポインタを表し、2つのアスタリスクはポインタへのポインタを表します。

0

* pはintに等しい5のアドレスです。したがって、メモリのどこかに、5に等しいintがあり、そのポインタがそのintのそのアドレスを指しています。

** pはメモリ内のポインタのアドレスです。だから、上のintを指すポインタがあると考えてください。しかし、その上に、intのポインタを指す別のポインタがあります。それを考えるもう一つの方法は、intのための別のアドレスのアドレスがあるということです。

+0

okありがとう.....私たちがポインタ**とa = 5を持っていれば、&aを書く必要がありますか? –

+0

実際には、変数の前に&を使用した場合にのみアドレスが与えられます。ポインタを間接参照するには、* stillを使用する必要がありますが、一度実行するとポインタ(アドレス)が得られます。私たちはもう一度逆参照する必要がありますが、それは二重ポインタを使用する方法ではありません。 通常、関数への通常のポインタを渡すためにダブルポインタを使用します。そうしないとコピーされるため、真のポインタは保持されます。これにより、元のポインタを失うことなく、そのポインタで作業することができます。私はそこに何を意味するかを示すために秒でリンクを掲示します。 –

+1

これは、ダブルポインタとその使い方を説明する簡単な方法です:[link](https://stackoverflow.com/questions/5580761/why-use-double-pointer-or-why-use-pointers-to-pointers ) –

関連する問題