簡體   English   中英

C,C ++中的指針

[英]Pointers in C, C++

這兩個是等價的嗎?

int a=10;
int *p=a; 

AND

int a=10;
int *p;
p=&a;

在這兩種情況下,p是否保留a的地址!?

在第一種情況下,的值a被復制到p (其存儲地址),所以p指向的地址10。

在第二種情況下, p指向a的地址。

還有第三種情況:

int a = 10;
int *p = malloc(sizeof(int));
*p = 10;

在這種情況下,值a被復制到由指向的地址p (由保留malloc()

在第一種情況下

int a=10;
int *p=a;

變量a中包含的值被放入變量p中。 所以變量p的值是10。

在第二種情況下

int a=10;
int *p;
p=&a;

變量a中的值為10,變量p中的值為a的地址。

在第一種情況下,即使變量p被聲明為指向int的指針,放入變量p的值也是變量a的值,值為10.在第二種情況下,您將放置變量的地址a到變量p。

只有第二種情況在技術上是正確的。 在第一種情況下,你的賦給a為'p之間,這樣分配給一個指針的整數-它可能工作,但它不就得了。

在第二種情況下,你正確的地址分配ap ,即一個int *int變量-這很好。

請注意,即使將變量聲明為指針,編譯器也不會自動獲取右側表達式的地址(因為在某些情況下它只是沒有意義,例如使用指針文字... )

嘗試:

int main()
{
    int a=10;
    int *p=a; 
}

然后編譯:

> g++ test.cpp
test.cpp: In function ‘int main()’:
test.cpp:4: error: invalid conversion from ‘int’ to ‘int*’

所以無效的C ++因為a不是指針。 C對類型信息稍微寬松一點就可以了。 但你可以得到你所要求的字面意思。 p的值是a (10)的valud。 所以p是指向地址10的指針(無論是否是有效地址是實現定義的)。

第二個版本在兩種語言中都有效。
因為你采取的地址a ,因此類型是分配給正確p 結果是p指向a

第一種情況不正確,因為指針應該有一些指向的地址,然后該值應該轉到該地址。 在第一種情況下,值轉到未指向的地址因此出錯。

在第二種情況下,指針開始指向變量的地址。 因此,它指向包含正確值的地址。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM