指針
指針的重要性
表示一些複雜的數據結構
快速的傳送數據
使函數返回一個以上的值
能否直接訪問硬件
能夠方便的使用數組和字符串
是理解面嚮對象語言中引用的基礎
指針是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本身所佔用的內存