指針和引用在C + +第1部分
指針和引用是兩個重要的概念在計算機科學。 他們似乎在許多編程語言,或用衣服一點點不同,但基本上是相同的待遇。 在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個職位,見參考,相似性和差異指針和引用,並最終指向函數的指針。
鏈接
- ponteiros.zip (所有來源的職位);
- 01 - declaracao.cpp
- 02 - tamanhos.cpp
- 03 - utilizando.cpp
- 04 - pegadinha.cpp
- 05 - enderecos.cpp
- 指針的cplusplus.com
- 有罪
評論
- 布魯諾
- 胡扯
- 費爾南多


