指針和引用在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 ; 字符 ç,* 電腦;
 pi ; 整合酶 ,* 皮;
 pd ; D,* 鈀;

 / / sizeof運算符說大小類型的參數。
 "Size of char:    " << sizeof ( c ) << " bytes" << endl ; 法院 “”“規格的字符:”“”sizeof( )“”“ 字節”“”endl;
 "Size of int:     " << sizeof ( i ) << " bytes" << endl ; 法院 “”“大小int的:”“”sizeof( )“”“ 字節”“”endl;
 "Size of double:  " << sizeof ( d ) << " bytes" << endl ; 法院 “”“大小雙:”“”sizeof( )“”“ 字節”“”endl;

 endl ; 法院 “”endl;

 "Size of char*:   " << sizeof ( pc ) << " bytes" << endl ; 法院 “”“大小的char *:”“”sizeof( )“”“ 字節”“”endl;
 "Size of int*:    " << sizeof ( pi ) << " bytes" << endl ; 法院 “”“大小int的*:”“”sizeof(π)“”“字節”“”endl;
 "Size of double*: " << sizeof ( pd ) << " bytes" << endl ; 法院 “”“大小雙*”“”sizeof(PD)  “”“字節”“”endl; 

使用指針

在他發言的內容的指針是一個隨機值,浪費記憶體,如同任何變量。 它是有益的,我們需要給他的東西。 作為一個指針擁有一個內存地址,我們為它指定一個有效的地址。

  17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 int * px, * py ; x = 13 ; y = 10 ; px = & x ; py = & y ; * px = 42 ; ( * py ) ++ ; cout << * px << endl ; cout << * py << endl ; cout << ( * px ) * ( * py ) << endl ; 廉政x,y, 廉政 *像素,* 秉恩中,x = 13,ý = 10,=& 十, 和Y = 秉恩; *像素= 42;(*)+ + 法庭 “”*像素“”endl 法院 “”*秉恩“”endl 法院 “”(*像素)*(*)“”endl; 

經營者 (符號或符號)的名字前一個變量的手段“解決”,因為他的名字是“地址”。

什麼是左側的平等必須能夠持有完全相同的類型,對方平等。 指針存儲的地址。 因此,要指定一個地址的指針,在這種情況下,你必須獲得一個地址與&運算。

除的情況下有隱式類型轉換(如數字類型之間),指定一個變量的東西用不同的類型及其原因編譯錯誤。 幸運的!

之後有一個指針指向一個有效的地址,我們可以訪問的內容,解決與經營者*(星號),其正式名稱是“經營者去參考。

請注意,星號在一份聲明中表示“指針類型”的背景下,在讀取或寫入的內容的指針,是指“的內容,地址”或“所指向的內容。” 也應小心,不要混淆的標誌產品算術。 為了避免混亂,請記住, 大表優先的經營者,您剛才通過的眼睛和被取消的被人遺忘。 在這裡你會發現,經營者參照優先在乘法運算。 一旦這樣做了你會記得,經營者的參考,是評估前的乘法運算。

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

 a ;=&1;
 b ;=&B酒店 ;

 pa * * pb ; ç =年利率* * * 鉛;
 pa * * pb ; ç =年利率* * * 鉛;
 pa * * pb ; ç =年利率* * * 鉛;
 pa ** pb ; ç = *** 基點;
 * pa ) * ( * pb ) ;=(*年息)*(* pb計);

 "Valor da Pegadinha: " << c << endl ; 法院 “”“價值花絮:”“”ç“”endl; 

所以當該算法的證據是什麼使你問任何最後 5行的例子中,你會說,它的內容乘以所指向的PA和PB。 它必須拿起放電因為這個! 並打破了現實生活中,如果你真的需要這麼做,你能救你的4代過去和未來的5 逐出教會,如果您選擇使用的最後一行。

你可以用一個共同的變量,你可以做的內容指向的指針,讀或者寫的(除非很明顯,指針是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 
  廉政A,B;
 pa, * pb ; 廉政 *,* 鉛;

 "Antes de qualquer atribuição: \n " ) ; printf(“在任何轉讓:\ N”的);

 "&a  = %p \n " , & a ) ; // Endereço válido dado pelo SO. printf(“&1 =%p \ N”的,&1)/ /有效的地址給予的操作系統。
 "&b  = %p \n " , & b ) ; // Endereço válido dado pelo SO. printf(“&B酒店=%p \ N”型,  )/ /有效的地址給予的操作系統。
 "&pa = %p \n " , & pa ) ; // Endereço válido dado pelo SO. printf(“&年利率=%p \ N”的,  巴勒斯坦權力機構); / /有效的地址給予的操作系統。
 "&pb = %p \n " , & pb ) ; // Endereço válido dado pelo SO. printf(“&鉛=%p \ N”的,  無鉛); / /有效的地址給予的操作系統。

 " \n " ) ; printf(“\ N”的);

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

 / /請取消註釋以下行,重新編譯和運行。
 / / printf(“*年利率=%d個\ N”的,*年利率)/ /會有什麼(隨機*)?
 / / printf(“*鉛=%d個\ N”的,* pb計); / /什麼是(隨機*)?

 " \n Após as inicializações dos ponteiros: \n " ) ; printf(“\ ñ初始化後的指針:\ N”的);

 a ;=&1;
 b ;=&B酒店 ;

 "&a  = %p \n " , & a ) ; // Mesmo endereço válido dado pelo SO. printf(“&1 =%p \ N”的,&1)/ /即使是有效的地址給予的操作系統。
 "&b  = %p \n " , & b ) ; // Mesmo endereço válido dado pelo SO. printf(“&B酒店=%p \ N”型,   )/ /即使是有效的地址給予的操作系統。
 "&pa = %p \n " , & pa ) ; // Mesmo endereço válido dado pelo SO. printf(“&年利率=%p \ N”的,  巴勒斯坦權力機構); / /即使是有效的地址給予的操作系統。
 "&pb = %p \n " , & pb ) ; // Mesmo endereço válido dado pelo SO. printf(“&鉛=%p \ N”的,  無鉛); / /即使是有效的地址給予的操作系統。

 " \n " ) ; printf(“\ N”的);

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

 "*pa = %d \n " , * pa ) ; // Conteúdo apontado por pa (*pa == a). printf(“*年利率=%d個\ N”的,* 年利率); / /內容任命巴(*巴== 1)。
 "*pb = %d \n " , * pb ) ; // Conteúdo apontado por pb (*pb == b). printf(“*鉛=%d個\ N”的,* pb計); / /內容指向鉛(*鉛== b)項。

 " \n Após as inicializações dos inteiros: \n " ) ; printf(“\ ñ初始化後的整數:\ N”的);

 ; 1 = 10;
 ;= 13;

 "&a  = %p \n " , & a ) ; // Mesmo endereço válido dado pelo SO. printf(“&1 =%p \ N”的,&1)/ /即使是有效的地址給予的操作系統。
 "&b  = %p \n " , & b ) ; // Mesmo endereço válido dado pelo SO. printf(“&B酒店=%p \ N”型,   )/ /即使是有效的地址給予的操作系統。
 "&pa = %p \n " , & pa ) ; // Mesmo endereço válido dado pelo SO. printf(“&年利率=%p \ N”的,  巴勒斯坦權力機構); / /即使是有效的地址給予的操作系統。
 "&pb = %p \n " , & pb ) ; // Mesmo endereço válido dado pelo SO. printf(“&鉛=%p \ N”的,  無鉛); / /即使是有效的地址給予的操作系統。

 " \n " ) ; printf(“\ N”的);

 "a   = %d \n " , a ) ; // Conteúdo inicializado (10). printf(“1 =%d個\ N”型,1); / /內容靴(10)。
 "b   = %d \n " , b ) ; // Conteúdo inicializado (13). printf(“乙=%d個\ N”型, )/ /內容靴(13)。
 "pa  = %p \n " , pa ) ; // Conteúdo inicializado (&a). printf(“巴=%p \ N”的, 年息 )/ /初始化內容(&1)。
 "pb  = %p \n " , pb ) ; // Conteúdo inicializado (&b). printf(“基點=%p \ N”的, 鉛); / /初始化內容(&b)項。

 "*pa = %d \n " , * pa ) ; // Conteúdo apontado por pa (*pa == a == 10). printf(“*年利率=%d個\ N”的,* 年利率); / /內容任命巴(*巴== 1 == 10)。
 "*pb = %d \n " , * pb ) ; // Conteúdo apontado por pb (*pb == b == 13). printf(“*鉛=%d個\ N”的,* pb計); / /內容指向鉛(*鉛== b == 13)。

 " \n Alterando os valores através dos ponteiros: \n " ) ; printf(“\ ñ改變通過指針的值:\ N”的);

 7 ; *= 7;
 42 ; *= 42;

 "&a  = %p \n " , & a ) ; // Mesmo endereço válido dado pelo SO. printf(“&1 =%p \ N”的,&1)/ /即使是有效的地址給予的操作系統。
 "&b  = %p \n " , & b ) ; // Mesmo endereço válido dado pelo SO. printf(“&B酒店=%p \ N”型,  )/ /即使是有效的地址給予的操作系統。
 "&pa = %p \n " , & pa ) ; // Mesmo endereço válido dado pelo SO. printf(“&年利率=%p \ N”的,  巴勒斯坦權力機構); / /即使是有效的地址給予的操作系統。
 "&pb = %p \n " , & pb ) ; // Mesmo endereço válido dado pelo SO. printf(“&鉛=%p \ N”的,  無鉛); / /即使是有效的地址給予的操作系統。

 " \n " ) ; printf(“\ N”的);

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

 "*pa = %d \n " , * pa ) ; // Conteúdo apontado por pa ( 7). printf(“*年利率=%d個\ N”的,* 年利率); / /內容任命巴(7)。
 "*pb = %d \n " , * pb ) ; // Conteúdo apontado por pb (42). printf(“*鉛=%d個\ N”的,* pb計); / /內容所指向的鉛(42)。 

該生產線 18和19,宣布respectivamnete兩個和兩個指針為整數。

該行23至26顯示的地址,我的變量。 這些報告都給予操作系統和是固定的,而這些變數存在。 變量不改變解決在程序,但可以改變一至另一個執行。 誰定義了該地址是操作系統的時間程序。 編譯器只知道X字節,需要為每個變量和解釋(樣式),該計劃將使這個空間。

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

請注意,它是安全的註釋行36和37,因為他們嘗試訪問的內容所指向的PA和PB,而尚未初始化。 在這次嘗試中,程序將嘗試解釋這些價值觀的隨機垃圾,好像他們是廉政的變量的地址有效。 根據不同的編譯器,操作系統使用,他們的命運可能是無害的,或者沒有。 可以肯定的是,這些行的結果是不可預測和確定來源的問題。

在41和42線的指針的地址初始化的整數變量 a和b 自那時以來,照片都在重複。

請注意,解決了指針不改變,什麼是預期。 如何改變其內容。 變量 PA和PB收到的地址A和B分別。 請注意內容的手,正是價值的地址變量 A和B是受到這個操作系統開始時的程序。 請與打印以上。 內容指向的PA和PB的內容是相同的A和B,它沒有被初始化,即垃圾。 然而,與前面的步驟,現在指向有效地址(地址的A和B),以及內容的A和B是垃圾內存指針指向的變量現在已經分配。

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

這一次coteúdos a和b是不是更垃圾。 價值觀是正確眾所周知的。 請注意,沒有變動處理變量與前面的步驟,只值。

另見後 A和B被初始化,其內容所指向的PA和PB也自動更改。 出現這種情況正是因為 PA和PB指向同一地區所使用的內存變量 PA和PB。 這也就是說,內容指向指針可以修改的內容,改變了原來的變量指出,由他負責。 最後,行81至97顯示,反過來也是如此,即改變的內容指向的指針,自動更改內容原變量指出他們。

它更容易理解這一思想,在對葡萄牙的短語比看代碼。

現在 ...

這是基本操作的指針。 仍然有有趣的事情被視為指針的功能,例如,但被認為是一種更高級的主題。 根據這一系列,計劃於 4員額,見參考資料,異同之間的指針和引用,最終指向函數的指針。

鏈接

評論

5回應“指針和引用在C + +第1部”

  1. [...]有了這個系列的企圖有關的職位指針和引用,開始談論指針,今天討論 [...]

  2. [...] [...] Pointeiros和參考

  3. [...]第一本系列後,我們要講一些指針。 在第二,我們談論的引用。 今天,我們將集中在親密關係(牛耳!)在指針和[...]

  4. 費爾南多在2009年12月26日18:50

    多德,你教我如何使您發布的代碼,您張貼?
    尤其是在一個盒子裡,這標誌著線,突出關鍵字的語言嗎?

  5. 洩密於2009年12月28日8時48分

    沒問題!

    WordPress的插件有一個叫做可濕性粉劑,語法,它使用幕後格西。

    一旦安裝,你可以把你的代碼裡面預標記,添加屬性“語言”和“線”。 語言是不言自明的,並有一個列表中的語言文件和行是起跑線。

    在格西也可以利用此功能添加在維基。

    提示:在您複製並粘貼代碼,將所有選項卡4位。 這將使得代碼獨立的方式應用到標籤。

    擁抱

留下回复




本站由可濕性粉劑Hashcash