天天看點

c指針

記憶體的編号:

一個位元組(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、動态記憶體是在堆配置設定的,

跨函數使用記憶體的問題:

位址:記憶體單元的編号;

繼續閱讀