記憶體的編号:
一個位元組(8個位)一個位元組編号(即 8個1 或者 8個0)
一個位元組一個編号:編号即位址。
位址(記憶體單元的編号)
指針:
指針的重要性
1、 表示一些複雜的資料結構
2、快速的傳輸資料
3、使函數傳回一個以上的值
4、能夠直接通路硬體
5、能夠友善的處理字元串
6、是了解面向對象語言中引用的基礎。
總結:指針是c語言的靈魂
#include <stdio.h>
int main(void)
{
int * p;
//p是指針變量(位址變量)的名字,int * 表示p編量存放的int類型變量的位址;
// int * p 不應該定義了一個名字叫做 *p的變量;
// int * p 應該這樣了解: p是變量名,p變量的資料類型的 int * 類型;
// 所謂int * 類型 實際就是存放 int變量位址的類型。
int i;
p = &i;
/*
1、p儲存了i的位址,是以p指向i,
2、p不是i,i也不是p,更準确的說:修改p的值不影響i;
修改i也不影響p;
3、如果一個指針變量指向了某個普通變量,則*指針變量
就完全等同于 普通變量
例子:
如果p是個指針變量,并且p存放了普通變量i的位址
則p指向了普通變量i。
*p 就完全等同于 i;
即 在使用出現 *p的地方都可以替換成 i;
在所有出現 i 的地方都可以替換成 *p;
*/
return 0;
}
1、指針就是位址,位址就是指針;
2、位址就是記憶體單元的編号;
3、指針變量是存放位址的變量;
4、指針和指針變量的兩個不同的概念;
5、但是要注意:通常我們叙述時會把指針變量簡稱為指針;
實際它們含義并不一樣;
6、指針的本質就是一個操作受限的非負整數(隻能進行減運算)。
指針的基本類型:
1、
*号的用法:
1、乘法;
2、定義指針變量
//定義了一個名字叫p的變量,int * 表示隻能存放int變量的位址;
3、指針運算符
該運算符放在已經定義好的指針變量的前面;
如果p是一個已經定義好的指針變量;
則*p表示 以p的内容為位址的變量;
指針和數組:
指針和一維數組
一維數組名是個 指針 常量
它存放的是一維數組的位址;
下标和指針的關系
如果p是個指針變量,則
p[i]永遠等價于*(p+i)
确定一個一維數組需要幾個參數
如果一個函數要處理一個一維數組,則需要接收該數組的那些資訊。
需要兩個參數:
數組第一個元素的位址,
數組的長度;
指針變量的運算
指針變量不能相加,也不能相乘,相除;
(如果兩個指針變量指向的是同一塊連續空間的不同的存儲單元,
這兩個指針變量才能相減。)
一個指針變量到底占幾個位元組;
知識:
sizeof(資料類型)
功能:傳回值就是該資料類型所占的位元組數;
例子:sizeof (int) = 4; sizeof(char)= 1;
sizeof(double) = 8;
sizeof(變量名)
功能:傳回值是該變量所占的位元組數;
假設p指向char類型變量(1個位元組)
假設q指向int類型變量(4個位元組)
假設r指向double類型變量(8個位元組)
p q r 本身所占的位元組數是否一樣
一樣,本身所占位元組數為4;(32個狀态,即32跟線)
總結:一個指針變量,無論它指向的變量占幾個位元組;
該指針變量 本身 隻占四個位元組
一個變量的位址使用該變量 首位元組的位址 來表示;
記憶體中一個位元組(8bit)對應一個編号
指針和二維數組
printf("%#x\n",&a[0]); //a[0]位址的輸出;
如何通過被調函數改變主調函數的值:
1、實參必須為該普通變量的值。
2、形參必須為指針變量。
3、在被調函數中通過
*形參名 = ....
的方式就可以修改主調函數相關變量的值。
專題: (非常重要)
動态記憶體控制:
傳統數組的缺點:
1、數組長度必須事先制定,并且隻能是常整數;不能說變量;
int a[5]; //ok
int len = 5; int a[len]; //error
2、傳統形式定義的數組,該數組的記憶體程式員無法手動釋放。
數組一旦定義,系統就會為該數字配置設定存儲空間就會一直存在。
除非數組所在地函數運作結束。
在一個函數運作期間,系統為該函數中數組配置設定的
記憶體空間會一直存在,直到該函數運作完畢時,
數組的空間才會被系統釋放。
3、數組的長度一旦定義,其長度就不能在更改。
數組的長度不能在函數運作的工程中動态的擴充或縮小。
4、傳統方式定義的數組不能跨函數使用。
A函數定義的數組,在A函數運作期間可以被其他函數使用,
但A函數運作完畢之後,A函數中的數組将無法被其他函數使用。
原因是: 調用函數運作完畢,數組空間被釋放了。。。
為什麼需要動态配置設定記憶體:
動态數組很好的解決了傳統數組的這4個缺陷。
傳統數組也叫靜态數組。
動态記憶體配置設定舉例___動态數組的構造(難點)
靜态記憶體和動态記憶體的比較
1、靜态記憶體是由系統自動配置設定,由系統自動釋放;
2、靜态記憶體是在棧配置設定的,
3、動态記憶體是有程式員手動配置設定, 手動釋放的;
4、動态記憶體是在堆配置設定的,
跨函數使用記憶體的問題:
位址:記憶體單元的編号;