[英]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之間,這樣分配給一個指針的整數-它可能工作,但它不就得了。
在第二種情況下,你正確的地址分配a
到p
,即一個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.