我是 C 的初學者(并且對 C 一無所知,來自 Java 和 Python 背景)。
我正在學習指標并運行我從我的自學檔案中共享的以下代碼:-
#include<iostream>
using namespace std;
int main(){
//What is a pointer:-
// A datatype that holds address of a variable in other datatype
int a=3;
int* b = &a; //CREATE A POINTER THAT POINTS TO A
// '&'STANDS FOR ADDRESS OF OPERATOR
// '*' IS CALLED DEREFERNCING OPERATOR
cout<< b<<endl; //prints address of a
cout<<&a<<endl; //does the same stuff
//retreving stored at a particular address
// '*' GIVES VALUE AT THE ADDRESS STORED IN POINTER
cout<<*b<<endl;
cout<<*&a<<endl;
//pointer to a pointer
int** c = &b; // pointer to another pointer b
cout<<"The address of b is"<<c<<endl;
cout<<"The address of b is"<<&b<<endl;
cout<<"The value at address c is"<<*c<<endl;
cout<<"The value at address value stored in c is "<< **c<<endl;
return 0;
}
這給了我以下輸出:-
0x94ac7ff7d4
0x94ac7ff7d4
3
3
The address of b is 0x94ac7ff7c8
The address of b is 0x94ac7ff7c8
The value at address c is 0x94ac7ff7d4
The value at address value stored in c is 3
激發好奇心的是我們看到的輸出的最后四行:-
c指向b
和
b指向a
它們本身不是變數,那么為什么它們不回傳相同的地址呢?這是否意味著對同一變數使用多個指標會占用系統資源從而導致設計不佳?
uj5u.com熱心網友回復:
一張圖片勝過千言萬語。
----------------
a: | 3 | 94ac7ff7d4
----------------
^
|
`-------------.
|
--------------|-
b: | 0x94ac7ff7d4 * | 94ac7ff7d8
----------------
^
|
`-------------.
|
--------------|-
c: | 0x94ac7ff7d8 * | 94ac7ff7dc
----------------
我認為變數a是一個可以容納整數的小盒子。在 C 中,我們通過 identifier 知道它a,但實際上,在機器級別,編譯器已將其分配給 address 0x94ac7ff7d4。
類似地,b是一個可以保存指向整數的指標的小盒子,它通常被實作為存盤整數的地址(數字)。我們通過 identifier 知道它b,但實際上,編譯器已將其分配到 address 0x94ac7ff7d8。
最后,c是一個可以保存指向整數指標的指標的盒子,該指標再次實作為存盤指標的地址。我們通過 identifier 知道它c,雖然你沒有這么說,但我猜編譯器已經將它分配給了 address 0x94ac7ff7dc。
對于任何變數,&為您提供存盤變數的地址——這是您可以存盤在指標變數中的那種值。
對于指標值,*為您提供指標指向的值。(對于指向指標的指標,**為您提供指標指向、指向等的指標的值)
uj5u.com熱心網友回復:
請記住,C 是一種非常低級的語言。很多東西實際上是沒有花哨的處理而存在的。
int *b;
b 是一個變數,就像任何值一樣。它存在于地址0x94ac7ff7c8并包含值0x94ac7ff7d4;
int **c = &b;
c也是一個變數。它存在于記憶體中(在程式未評估的地址處)它包含值0x94ac7ff7c8,該值與 的地址相同b。
與 php 的參考不同,C 的指標不會自動指向 'real' 變數。執行此操作時,您實際上所做的就是為 分配一個值c,因為這就是=運算子所做的。
c = 0x94ac7ff7c8;
因此,c 和 b 包含不同的值。
當評估“ **c”時,您會問:
“地址 c 的價值是多少?0x94ac7ff7c8好的,那么地址中的價值是0x94ac7ff7c8多少?” 這個問題的答案是**c
請注意,以下幾行有兩種不同的含義:
int **c = x;
**c = x;
首先,您要宣告一個雙指標型別。星號屬于運算式int **。這里 x 必須是型別int **
在第二個中,您取消參考c兩次。星號屬于表達**c如在*(*(c))。這里 x 必須是型別int
區別不會造成歧義,因為在宣告指標時不可能取消參考它。它沒有價值,因此沒有要獲取的地址。
uj5u.com熱心網友回復:
如果你只是寫&a那么它不是一個變數,但是一旦你宣告了一個整數,它就變成了一個變數,b它恰好存盤了另一個變數的地址。
uj5u.com熱心網友回復:
宣告為指標的變數是指標型別的物件。他們占據了自己的記憶。
所以這些宣告
int a=3;
int* b = &a;
int** c = &b;
宣告三個不同的變數來存盤不同的值。第一個變數具有型別int并存盤值3。第二個變數具有型別int *并存盤第一個變數的地址。第三個變數具有型別int **并存盤第二個變數的地址。
如果你有這樣的宣告
T a;
其中 T 是某種型別說明符,那么指向該變數的指標的宣告將如下所示
T *p = &a;
例如,其中 T 可以是int *。在這種情況下,您將擁有宣告
int * *p = &a;
或省略多余的空白看起來像
int **p = &a;
uj5u.com熱心網友回復:
指標和其他物件一樣是一個物件。它有一個型別和一個值。通常,指標保存另一個物件的地址,盡管這并不像您想象的那樣特殊。
考慮一下:
int a = 0;
int b = 0;
int* p = &a;
p = &b;
int* p = &a;初始化p為指向a. ps 值是 的地址a。下一行p指向b。現在ps 的值是 的地址b。指標值需要存盤在某處,就像int a = 0;值0需要存盤在某處一樣。
在記憶體中,theint a和 of的值int* p只是位和位元組。只有將指標解釋為“整數”或“指向整數”才能使指標變得特殊。
uj5u.com熱心網友回復:
為什么指標的地址與它們指向的變數的地址不同?
指標是與指標指向的物件不同的物件(除非指標指向自身)。具有重疊存盤持續時間的兩個不同物件通常不能存盤在同一地址中。
它們本身不是變數
這是一個錯誤的假設。b并且本身c 就是變數。
這是否意味著對同一個變數使用多個指標會占用系統資源
大多數物件可能會消耗記憶體。指標物件也不例外。
從而導致糟糕的設計?
沒有辦法從前提下得出這樣的結論。有時很多指標是有益的。
uj5u.com熱心網友回復:
鑒于您的“非變數”印象,請考慮以下代碼。
int a = 3;
int b = 4;
int *p = &a;
std::cout << p << " -> " *p << std::endl;
p = &b;
std::cout << p << " -> " *p << std::endl;
uj5u.com熱心網友回復:
專案清單
變數是計算機主記憶體 (RAM) 中用于存盤資料的記憶體位置。指標是計算機主記憶體(RAM)中的記憶體位置,用于存盤變數的地址。指標與它們所指向的變數的地址不同,因為指標也是一種變數,具有不同的和自己的地址。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/314973.html
下一篇:使用物件指標訪問運算子多載函式
