指針和引用在C + +第1部分

2009年4月19日號發布的的C / C + +

指針和引用是兩個重要的概念在計算機科學。 他們似乎在許多編程語言,或用衣服一點點不同,但基本上是相同的待遇。 在C + +和指針的技能是必不可少的。

指針是一個特殊的數據類型,變量,其宣稱的目標這種可能(或不會)其他一些數據在內存中。 一個指針變量,擁有處理的另一件事情在內存中。 這東西可以是一個變量,常數,啟動一個數據集,函數,等等。

聲明指針

該宣言的指針通常是通過附加一個 *前的變量名。 一個符號使用的膠水多*類型的名稱說是象徵性地宣布“指針的類型”,而不是一個“指針變量”,但它們是等價的。 例如:

  / /指向一個int。
 ptr_num1 ; 詮釋 * ptr_num1;

 / /左右。
 ptr_num2 ; 詮釋 * ptr_num2;

 / /指針到兩倍。
 ptr_double1 ;  * ptr_double1;

 / /左右。
 ptr_double2 ;  * ptr_double2; 

一旦宣布,該指針存在,有大小,因此發生在內存中。 一個指針的大小通常等於數位的機器 /系統有問題,如4字節的32位系統。

  17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 pc ; int i, * pi ; double d, * pd ; // O operador sizeof diz o tamanho do tipo do seu argumento. cout << "Size of char:    " << sizeof ( c ) << " bytes" << endl ; cout << "Size of int:     " << sizeof ( i ) << " bytes" << endl ; cout << "Size of double:  " << sizeof ( d ) << " bytes" << endl ; cout << endl ; cout << "Size of char*:   " << sizeof ( pc ) << " bytes" << endl ; cout << "Size of int*:    " << sizeof ( pi ) << " bytes" << endl ; cout << "Size of double*: " << sizeof ( pd ) << " bytes" << endl ; 字符c,* 電腦, 詮釋,* 圓周率, ,* 鈀; / / sizeof運算符說,大小類型的參數。 法院 “”“大小的字符 :”<<大小 (三)<<“ 字節“<<恩德; 法院 ”“”大小的詮釋:“<<大小 (一)<<” 字節“<<恩德; 法院 ”“”大小雙:“<<大小 (四)<<” 字節“ <<恩德; 法院 <<恩德; 法院 “”“大小 的字符 *:”<<大小 (處長 )<<“字節”<< 恩德; 法院 “”“大小 的詮釋 *:”<<大小 (皮) <<“字節”<< 恩德; 法院 “”“大小  *”<<大小 (PD)的 <<“字節”<< 恩德; 

使用指針

他的發言後,指針的內容是一個隨機值,垃圾內存,如同任何變量。 它是有益的,我們需要給他一些事。 作為一個擁有一個內存地址的指針,我們必須為它分配一個有效的地址。

  17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
  詮釋x,y;
 px, * py ; 詮釋 *像素,* Py的;

 ; x = 13;
 ;為y = 10;

 x ;像素= 及X;
 y ; 吡啶= Ÿ;

 42 ; *過氧化物酶= 42;
 py ) ++ ; (*吡啶)+ +;

 * px << endl ; 法院 <<*像素<<恩德;
 * py << endl ; 法院 <<* Py的<<恩德;
 ( * px ) * ( * py ) << endl ; 法院 <<(*像素)*(*吡啶 )<<恩德; 

經營者&(與符號或符號 ),然後一個變量名字的意思是“地址”,因為他的名字是“地址。”

什麼是左邊的平等,能夠保持完全一樣,是一種比另一邊的平等。 商店的地址指針。 因此,要指定一個地址指針在這種情況下,你需要獲得一個地址與&運算符。

除的情況下有隱式類型轉換(如數字類型之間),指定一個變量來使用不同類型的東西比他自己的,導致一個編譯錯誤。 幸運的!

經過指針已經指向一個有效的地址,我們可以訪問這個地址的內容與經營者*( 星號 ),其正式名稱是“去參考運營商。”

請注意,星號在一份聲明中表示“指針型”,在上下文閱讀或書寫的內容,一個指針,是指“的內容地址”或“所指出的內容”。 同時注意不要混淆符號算術產品。 為了避免混淆,請記住, 大表優先的經營者 ,你只是通過眼睛和下降的感覺。 在那裡,您會發現,解除引用操作符優先於乘法運算符。 然後,你會記得,去參考運營商進行評估之前,乘法運算符。

  17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
  pa, * pb ; 詮釋一,乙,丙,*,* 鉛;
 ; 1 = 2;
 ; b = 3;

 a ;年利率=&1;
 b ;=&B組;

 pa * * pb ; ç = *每年* 鉛;
 pa * * pb ; ç = *每年* 鉛;
 pa * * pb ; ç = *每年* 鉛;
 pa ** pb ; ç = *每年** 基點;
 * pa ) * ( * pb ) ; ç =(*年息)*(* 鉛);

 "Valor da Pegadinha: " << c << endl ; 法院 “”“抓把柄的價值:”<<ç <<恩德; 

所以當該證明的算法是什麼讓你問任何一個在過去五年線的例子中,你會說,它的內容乘以所指向美聯社和BP。 沒有更多的選擇了DP的吧! 並打破了現實生活中,如果你真的需要做到這一點,你能救你的第四和第五代的過去未來逐出教會 ,如果您選擇使用的最後一行。

一切有可能與一個共同的變量你可以做的內容所指向一個指針,無論是閱讀或寫作(除非是明確的指針是const,但這是另一次談話 ...).

地址和指針

就拿下面的代碼:

  18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
  詮釋;
 pa, * pb ;每年詮釋 *,* 鉛;

 "Antes de qualquer atribuição: \n " ) ; 輸出 (“在任何任務:\ ñ”);

 "&a  = %p \n " , & a ) ; // Endereço válido dado pelo SO. 輸出 (“&1 =%p \ ñ”,&1)/ /合法的地址賦予的操作系統。
 "&b  = %p \n " , & b ) ; // Endereço válido dado pelo SO. 輸出 (“和B =%p \ N”的, B)/ /合法的地址賦予的操作系統。
 "&pa = %p \n " , & pa ) ; // Endereço válido dado pelo SO. 輸出 (“&年利率=%p \ ñ”,& 年息)/ /合法的地址賦予的操作系統。
 "&pb = %p \n " , & pb ) ; // Endereço válido dado pelo SO. 輸出 (“&鉛=%p \ N”的,  英國石油公司); / /合法的地址賦予的操作系統。

 " \n " ) ; 輸出 (“\ ñ”);

 "a   = %d \n " , a ) ; // Conteúdo não inicializado (aleatório). 輸出 (“1 =%d行\ n”,1); / /內容未初始化(隨機)。
 "b   = %d \n " , b ) ; // Conteúdo não inicializado (aleatório). 輸出 (“乙 =%d行\ n”, )/ /未初始化的內容(隨機)。
 "pa  = %p \n " , pa ) ; // Conteúdo não inicializado (aleatório). 輸出 (“年利率 =%p \ N”的, 年息 )/ /未初始化的內容(隨機)。
 "pb  = %p \n " , pb ) ; // Conteúdo não inicializado (aleatório). 輸出 (“基點 =%p \ N”的, 鉛); / /內容未初始化(隨機)。

 / /請取消註釋以下行,重新編譯和運行。
 / /輸出(“*年利率=%d行\ n”,*年息)/ /什麼是(隨機*)?
 / /輸出(“*鉛=%d行\ n”,*鉛)/ /什麼是(隨機*)?

 " \n Após as inicializações dos ponteiros: \n " ) ; 輸出 (“\ ñ經過初始化的指針:\ ñ”);

 a ;年利率=&1;
 b ;=&B組;

 "&a  = %p \n " , & a ) ; // Mesmo endereço válido dado pelo SO. 輸出 (“&1 =%p \ ñ”,&1)/ /即使是有效的地址賦予的操作系統。
 "&b  = %p \n " , & b ) ; // Mesmo endereço válido dado pelo SO. 輸出 (“和B =%p \ N”的, B)/ /即使是有效的地址賦予的操作系統。
 "&pa = %p \n " , & pa ) ; // Mesmo endereço válido dado pelo SO. 輸出 (“&年利率=%p \ ñ”,& 年息)/ /同一地址為有效的操作系統。
 "&pb = %p \n " , & pb ) ; // Mesmo endereço válido dado pelo SO. 輸出 (“&鉛=%p \ N”的,  英國石油公司); / /同一地址為有效的操作系統。

 " \n " ) ; 輸出 (“\ ñ”);

 "a   = %d \n " , a ) ; // Conteúdo não inicializado (aleatório). 輸出 (“1 =%d行\ n”,1); / /內容未初始化(隨機)。
 "b   = %d \n " , b ) ; // Conteúdo não inicializado (aleatório). 輸出 (“乙 =%d行\ n”, )/ /未初始化的內容(隨機)。
 "pa  = %p \n " , pa ) ; // Conteúdo inicializado (&a). 輸出 (“年利率 =%p \ N”的, 年息 )/ /初始化的內容(&1)。
 "pb  = %p \n " , pb ) ; // Conteúdo inicializado (&b). 輸出 (“基點 =%p \ N”的, 鉛); / /初始化的內容(&b)項。

 "*pa = %d \n " , * pa ) ; // Conteúdo apontado por pa (*pa == a). 輸出 (“*年利率=%d行\ n”,* 年息)/ /內容指出,美聯社(*每年== 1)。
 "*pb = %d \n " , * pb ) ; // Conteúdo apontado por pb (*pb == b). 輸出 (“*鉛=%d行\ n”,* )/ /內容指出,由英國石油公司(BP == * b)項。

 " \n Após as inicializações dos inteiros: \n " ) ; 輸出 (“\ ñ經過初始化的整數:\ ñ”);

 ; 1 = 10;
 ; b = 13;

 "&a  = %p \n " , & a ) ; // Mesmo endereço válido dado pelo SO. 輸出 (“&1 =%p \ ñ”,&1)/ /即使是有效的地址賦予的操作系統。
 "&b  = %p \n " , & b ) ; // Mesmo endereço válido dado pelo SO. 輸出 (“和B =%p \ N”的, B)/ /即使是有效的地址賦予的操作系統。
 "&pa = %p \n " , & pa ) ; // Mesmo endereço válido dado pelo SO. 輸出 (“&年利率=%p \ ñ”,& 年息)/ /同一地址為有效的操作系統。
 "&pb = %p \n " , & pb ) ; // Mesmo endereço válido dado pelo SO. 輸出 (“&鉛=%p \ N”的,  英國石油公司); / /同一地址為有效的操作系統。

 " \n " ) ; 輸出 (“\ ñ”);

 "a   = %d \n " , a ) ; // Conteúdo inicializado (10). 輸出 (“1 =%d行\ n”,1); / /內容開始(10)。
 "b   = %d \n " , b ) ; // Conteúdo inicializado (13). 輸出 (“乙 =%d行\ n”, )/ /內容開始(13)。
 "pa  = %p \n " , pa ) ; // Conteúdo inicializado (&a). 輸出 (“年利率 =%p \ N”的, 年息 )/ /初始化的內容(&1)。
 "pb  = %p \n " , pb ) ; // Conteúdo inicializado (&b). 輸出 (“基點 =%p \ N”的, 鉛); / /初始化的內容(&b)項。

 "*pa = %d \n " , * pa ) ; // Conteúdo apontado por pa (*pa == a == 10). 輸出 (“*年利率=%d行\ n”,* 年息)/ /內容指出,美聯社(*巴== 1 == 10)。
 "*pb = %d \n " , * pb ) ; // Conteúdo apontado por pb (*pb == b == 13). 輸出 (“*鉛=%d行\ n”,* )/ /內容指出,鉛(*鉛==且b == 13)。

 " \n Alterando os valores através dos ponteiros: \n " ) ; 輸出 (“\ ñ價值觀的變化,通過指針:\ ñ”);

 7 ; *= 7;
 42 ; *血壓= 42;

 "&a  = %p \n " , & a ) ; // Mesmo endereço válido dado pelo SO. 輸出 (“&1 =%p \ ñ”,&1)/ /即使是有效的地址賦予的操作系統。
 "&b  = %p \n " , & b ) ; // Mesmo endereço válido dado pelo SO. 輸出 (“和B =%p \ N”的, B)/ /即使是有效的地址賦予的操作系統。
 "&pa = %p \n " , & pa ) ; // Mesmo endereço válido dado pelo SO. 輸出 (“&年利率=%p \ ñ”,& 年息)/ /同一地址為有效的操作系統。
 "&pb = %p \n " , & pb ) ; // Mesmo endereço válido dado pelo SO. 輸出 (“&鉛=%p \ N”的,  英國石油公司); / /同一地址為有效的操作系統。

 " \n " ) ; 輸出 (“\ ñ”);

 "a   = %d \n " , a ) ; // Conteúdo inicializado (a == *pa ==  7). 輸出 (“1 =%d行\ n”,1); / /內容初始化(*巴== 1 == 7)。
 "b   = %d \n " , b ) ; // Conteúdo inicializado (b == *pb == 42). 輸出 (“乙 =%d行\ n”, )/ /內容初始化(二== *鉛== 42)。
 "pa  = %p \n " , pa ) ; // Conteúdo inicializado (&a). 輸出 (“年利率 =%p \ N”的, 年息 )/ /初始化的內容(&1)。
 "pb  = %p \n " , pb ) ; // Conteúdo inicializado (&b). 輸出 (“基點 =%p \ N”的, 鉛); / /初始化的內容(&b)項。

 "*pa = %d \n " , * pa ) ; // Conteúdo apontado por pa ( 7). 輸出 (“*年利率=%d行\ n”,* 年息)/ /內容任命巴(7)。
 "*pb = %d \n " , * pb ) ; // Conteúdo apontado por pb (42). 輸出 (“*鉛=%d行\ n”,* )/ /內容指出,由英國石油公司(42)。 

線路 18:19 respectivamnete聲明兩個整數和兩個指針為整數。

23-26線顯示我的變量的地址。 這些地址被賦予的操作系統,是固定的,而這些變量存在。 一個變量不更改地址,在計劃,但可以改變一個執行和另一個之間。 誰定義該地址是什麼操作系統,當時的方案執行。 編譯器只知道X字節,需要每個變量和解釋(樣式),該計劃將提供這方面的空間。

30-33線顯示這些變量的內容,而沒有被初始化。 它的垃圾,最後一個值,有人(不知道是誰)把這些地方在計算機內存中,現在它也屬於我的變量。

請注意它是不是安全線 36條和第37條註釋,因為他們試圖訪問的內容所指向的AP和BP公司,一直沒有被初始化。 在此嘗試,該方案將嘗試解釋這些價值觀,如果他們的垃圾隨機變量詮釋有效地址。 根據不同的編譯器,操作系統使用,他們的命運可能是無害的,或沒有。 可以肯定的是,這些行的結果是不可預測和確定來源的問題。

論線 41和42的指針的地址初始化的整數變量 A和B 此後,重複打印。

見的地址的指針不改變,什麼是預期。 什麼是它的內容變化。 變量 PA和PB收到的地址分別為 A和B。 請注意內容的手中,正是地址值的變量 a和b是被賦予的操作系統在開始的方案。 請與打印以上。 所指向的內容 AP和BP是相同的內容和b,一直沒有被初始化,或垃圾。 然而,與前面的步驟,現在指針指向有效地址(地址的A和B),以及內容的a和b是垃圾內存指針指向的變量現在已經分配。

論線 61和62的整數變量初始化值10和13,一再重複打印。

這一次,coteúdos A和B不再垃圾。 值是已知的正確。 請注意有沒有改變在解決變量相對於前面的步驟中,只有價值觀。

又見後 A和B都被初始化,其內容指出,美聯社和英國石油公司也已自動更改。 出現這種情況,正是因為巴鉛,指向同一個內存區域使用的變量 PA和PB。 這意味著,所指向的內容可以修改一個指針,通過改變原有的內容,他指出變數。 最後,行81-97顯示,反過來也是如此,即改變原有內容的指針所指向的,自動改變了原來的變量的內容,他們指出。

這是比較容易理解這一思想在葡萄牙語中的短語比看代碼。

現在 ...

這是基本的操作與指針。 仍然有有趣的事情被視為指針功能,例如,但被認為是一個更高級的主題。 經過這一系列,這是計劃於 4個職位,見參考,相似性和差異指針和引用,並最終指向函數的指針。

鏈接

評論

  • 好戲同一篇文章,我希望繼續 proxximos職位。
  • 沒問題!

    WordPress有一個插件叫做可濕性粉劑,語法 ,它使用幕後稱作GeSHi

    一旦安裝,你可以把代碼中的PRE標記,添加屬性“語言”和“行”。 語言是不言而喻的要求,有一個列表文件中的語言和路線是起跑線。

    稱作 GeSHi還可以用於添加此能力,維基。

    提示:在您複製和粘貼代碼,替換所有標籤由4位。 這使代碼獨立的方式適用於標籤。

    擁抱
  • 費爾南多
    哥們兒,你教我如何如何讓你的代碼後,你張貼?
    尤其是在一個盒子,標誌著線,突出了語言的關鍵字?
博客的評論本站 Disqus