指針理解

指針
 指針的重要性
  表示一些複雜的數據結構 
  快速的傳送數據     
  使函數返回一個以上的值
  能否直接訪問硬件    
  能夠方便的使用數組和字符串 
  是理解面嚮對象語言中引用的基礎
  
  指針是C語言的靈魂
 定義
  地址
   內存單元的編號
   從0開始的非負整數
   範圍0-FFFFFFFF 【0 到 4G-1】
  指針
   指針就是地址  地址就是指針
   指針變量就是存放內存單元地址的變量
   指針本質上就是一個操作受限的非負整數
 分類
  1、基本類型指針【略】
   基本概念 
    int i=10;
    int *p = &i; //等價於 int *p; p = &i;
    詳解這兩部操作:
    1)、p存放了i的地址,所以我們說p指向了i
    2)、p和i是完全不同的兩個變量,修改其中的任意一個變量的值,不會影響另一變量的值
    3)、p指向i,*p就是i變量本身。更形象的說所有出現*p的地方都可以換成i,所有出現i
     的地方都可以換成*p
    
    總結: 1、 如何一個指針變量(假定爲p)存放了某個普通變量(假定爲i)的地址,
       那我們就可以說:“p指向了i”, 但p與i是兩個不同的變量,
       修改p的值不影響i的值,修改i的值不影響p的值.
      2、 *p等價於i  或者說*p可以與i在任何地方互換
      3、 如果一個指針變量指向了某個普通變量,則
       *指針變量  就完全等價於  該普通變量
    注意:
     指針變量也是變量,只不過它存放的不能是內存單元的內容,只能存放內存單元的地址
     普通變量前不能加*
     常量和表達式前不能加&
 
   如何通過被調函數修改主調函數中普通變量的值   
    Ⅰ 實參爲相關變量的地址
    Ⅱ 形參爲以該變量的類型爲類型的指針變量
    Ⅲ 在被調函數中通過  *形參變量名 的方式就可以修改主函數相關變量的值
  2、指針和數組
   指針 和 一維數組
    數組名
     一維數組名是個指針常量,
     它存放的是一維數組第一個元素的地址,
     它的值不能被改變
     一維數組名指向的是數組的第一個元素
    下標和指針的關係
     a[i] <<==>> *(a+i)
     
     假設指針變量的名字爲p
     則p+i的值是p+i*(p所指向的變量所佔的字節數)
    指針變量的運算
     指針變量不能相加,不能相乘,不能相除
     如果兩指針變量屬於同一數組,則可以相減
     指針變量可以加減一整數,前提是最終結果不能超過指針允許指向的範圍
      p+i的值是p+i*(p所指向的變量所佔的字節數)
      p-i的值是p-i*(p所指向的變量所佔的字節數)
      p++  <==> p+1
      p--  <==>   p-1
   舉例
     
    如何通過被調函數修改主調函數中一維數組的內容【如何界定一維數組】
     兩個參數
      存放數組首元素的指針變量
      存放數組元素長度的整型變量


動態內存分配和釋放: 
 動態構造一維數組  
  假設動態構造一個int型數組
  int *p = (int *)malloc(int len);
   1、 malloc只有一個int型的形參,表示要求系統分配的字節數
   2、 malloc函數的功能是請求系統len個字節的內存空間,如果請求分配成功,
    則返回第一個字節的地址,如果分配不成功,則返回NULL
   3、 malloc函數能且只能返回第一個字節的地址,所以我們需要把這個無任何實
    際意義的第一個字節的地址(俗稱乾地址)轉化爲一個有實際意義的地址,因此
    malloc前面必須加(數據類型 *),表示把這個無實際意義的第一個字節的地址
    轉化爲相應類型的地址。如:
     int *p = (int *)malloc(50);
           表示將系統分配好的50個字節的第一個字節的地址轉化爲int *型的
           地址,更準確的說是把第一個字節的地址轉化爲四個字節的地址,這
           樣p就指向了第一個的四個字節,p+1就指向了第2個的四個字節,
           p+i就指向了第i+1個的4個字節。p[0]就是第一個元素, p[i]就是第
           i+1個元素
     double *p = (double *)malloc(80);
           表示將系統分配好的80個字節的第一個字節的地址轉化爲double *型的
           地址,更準確的說是把第一個字節的地址轉化爲8個字節的地址,這
           樣p就指向了第一個的8個字節,p+1就指向了第2個的8個字節,
           p+i就指向了第i+1個的8個字節。p[0]就是第一個元素, p[i]就是第
           i+1個元素
  free(p)
   釋放p所指向的內存,而不是釋放p本身所佔用的內存

 

發佈了81 篇原創文章 · 獲贊 30 · 訪問量 28萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章