程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 認識指針

認識指針

編輯:C++入門知識

指針的定義是一種保存變量地址的變量。這篇文章主要是清楚“指針保存變量地址”這個認知。   首先認識兩個符號:*是間接尋址或間接引用運算符。 &用來取一個對象的地址。   常見指針用法如下:   [cpp]   int *p;         int x = 1;                   p = &x;   printf("p = %x, &x = %x\n", p, &x);   printf("*p = %d, x = %d\n", *p, x);   對指針內部布局有一個認識: 首先明確幾個概念:   指針變量本身起始地址未知,指針變量裡存儲的是內存地址。不管指針變量裡存的是任何數據,都被當做地址來處理。   *前面的數據類型,只是說明指針所指向的內存裡存儲的數據類型。但在指針增值時,用處頗大。   不管什麼樣的指針類型,其大小都為4byte。(當然,這個與操作系統位數等有關)   認識一下,指針操作的每一步。   聲明後,未進行任何操作:   [cpp]    int *p;    printf("&p = %x,p = %x, *p = %d\n", &p, p, *p);   // &p = 0022ff44,p = 768d9e34, *p = -7494423    //此時,p是一個野指針,其值是系統任意賦的。p和*p都是沒有實際意義的。     指針賦值為空: [cpp]           p = (int *)NULL; //NULL的值為0            printf("&p = %x,p = %x\n", &p, p);           // &p = 22ff44,p = 0 , *p沒有意義    這裡,因為系統分配給每個程序一定的內存空間,程序不可訪問未分配給自己的內存。 P指向一個有意義的數值:   [cpp]   int a = 2;   p = &a;   *p = NULL;    printf("p = %x,&a = %x, *p = %d, a = %d\n", p, &a, *p, a);   // p = 0022ff40, &a = 0022ff40, *p = 0, a = 0               *p = 8;   printf("p = %x,&a = %x, *p = %d, a = %d\n", p, &a, *p, a);    // p = 0022ff40, &a = 0022ff40, *p = 8, a = 8   將數據存儲到指定的內存地址(略顯暴力): [cpp]   <span style="white-space:pre">  </span>//int a = 1;           //printf("&a = %x\n", &a);           p = (int *)0x22ff40;   //p指向地址 0x22ff40           *((int *)2293568) = 10;  //在該內存上填值            printf("p = %x, *P = %d\n", p, *p);           // p = 22ff40, *p = 10   這裡先打印出a的地址,為0x22ff40,表明這個地址可用,再賦值給指針p。     特殊情況下: [cpp]   <span style="white-space:pre">  </span>p = (int *)&p;           printf("&p = %d, p = %d, *P = %d\n", &p, p, *p);           *p = 0x22ff40;           printf("&p = %d, p = %d, *P = %d\n", &p, p, *p);                   *p = 0;           printf("&p = %d, p = %d, *P = %d\n", &p, p, *p);              /*          &p = 2293572, p = 2293572, *P = 2293572          &p = 2293572, p = 2293568, *p = 16      //改變*p的值,實際改變的是p保存的地址值          &p = 2293572, p = 229356, *p = 0        //p的值已定,再改變*p,則改的就是指向的值,此時*p = 0.           */   malloc和free的注意事項:   [cpp]      p = (int *)malloc(sizeof(int) * 5);       if(p == NULL)  //需要檢查p是否為空,因為系統可能無法分配那麼多內存給你哦!           return;      *p = 123;      printf("&p = %p, p = %x, *P = %d\n", &p, p, *p);      free(p);      printf("&p = %p, p = %x, *P = %d\n", &p, p, *p);   //   *p = 222;   //   printf("&p = %p, p = %x, *P = %d\n", &p, p, *p);   //  &p = 0022ff44, p = 251010, *P = 222   //  操作違法,報錯。free之後再對其進行修改,雖打印出結果,但最後還是報錯。      p = NULL;   //free之後一定要將p置為空,然後才能使用,否則會出現野指針。      printf("&p = %p, p = %x\n", &p, p);                              /*     &p = 0022ff44, p = 251010, *P = 123     &p = 0022ff44, p = 251010, *P = 2439224     &p = 0022ff44, p = 0     free之後,p的值還沒有改變,只是斬斷了p與之前malloc開辟的那段內存之間的關系,     即那段內存已經不是屬於p的了,系統可能已經把該塊內存分配給別的程序了,p不能擅自更改。     以上結果知,仍可以通過p訪問內存,但不能修改(修改後報錯),而且訪問的值可能已經改變了     (第二次打印結果*P = 2439224)。           free之後一定要將p置為空,然後才能使用,否則會出現野指針。     指針p的類型以及它所指的內存的容量事先都是知道的,所以語句free(p)能正確地釋放內存.     如果p是 NULL指針,那麼free對p無論操作多少次都不會出問題。     如果p不是NULL指針,那麼free對p連續操作兩次就會導致程序運行錯誤。             */     通過以上內容,應該能對指針變量的本質有個清楚的認識。          

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved