郝斌資料結構自學筆記 5 預備知識 指標

2021-07-07 05:17:53 字數 1803 閱讀 8520

5_

預備知識_指標

_2 指標的重要性:

指標是c語言的靈魂

定義:cpu*****位址線,控制線,資料線*****記憶體

指標:指標就是位址,位址就是指標。

指標變數是存放記憶體單元位址的變數。

指標的本質是乙個操作受限的非負整數。

分類:1.基本型別的指標

2.指標和陣列的關係

變數並不一定連續分配,隨機分配記憶體。

記憶體:記憶體是多位元組組成的線性一維儲存空間。

記憶體的基本劃分單位是位元組。

每個位元組含有8位,每一位存放1個0或1個1.

記憶體和編號是一一對應的。

軟體在執行前需要向作業系統申請儲存空間。在軟體執行期間,該軟體所佔空間不再分配給其他軟體。當軟體執行完畢後,作業系統將**該記憶體空間(作業系統並不清空該記憶體空間中遺留下來的資料)。

note:1)指標變數也是變數,普通變數前不能加*,常亮和表示式前不能加&。

2)區域性變數只在本函式內部使用。

如何通過被調函式修改主調函式中普通變數的值。

2)形參為以該變數的型別為型別的指標變數;

3)在被調函式中通過   *形參變數名的形式   的形式就可以修改主函式。

case 1

#include

int main(void)

int*p;       //p是個變數名字,int*表示該p變數只能儲存int型別變數的位址

inti=10;

intj;

//      j=*p;

//      printf("%d\n",j);       //error,p未指定

//      charch='a';

//      p=&ch;     //error,型別不一致

p=&i;   //p儲存i的位址,p指向i;修改p的值不影響i的值,修改i的值不影響p的值;任何場合下,*p和i可以互換。*p等價於i。

//p=10;     //error

j=*p;//等價於j=i;

printf("i=%d,j=%d,*p=%d\n",i,j,*p);

return0;

case 2

#include

void f(int * i)//不是定義了乙個名字叫做*i的形參,而是定義了乙個形參,該形參名字叫做i,它的型別是int*

*i=100;    

int main(void)

inti=9;

f(&i);         //區域性變數只在本函式內部使用。

printf("i=%d\n",i);

指標和數字

case 1

a[3]==*(3+a);   3[a] ==*(a+3)==*(3+a);

int a[5]=;

show_aarry(a,5);//a等價於&a[0],&a[0]本身就是int*型別

void show_array(int * p,int len)

inti;

//p[2]=-1;//   p[0]=*p ; p[2]==*(p+2)==*(a+2)==a[2] ; p[i]就是主函式的a[i]

for (i=0;iprintf(「%d\n」,p[i]);

指標變數的運算

指標變數不能相加,不能相乘,不能相除。

如果兩指標變數屬於同一陣列,則可以相減。

指標變數可以加減一整數,前提是最終結果不能超過指標變數

p+i的值是p+i*(p所指向的變數所佔的位元組數)

p-i的值是p-i*(p所指向的變數所佔的位元組數)

p++<==>p+1   p--<==>p-1

郝斌資料結構1 預備知識 指標 跨函式使用記憶體

結構體 為什麼會出現結構體 為了表示一些複雜的資料,而普通的基本資料型別無法滿足要求 定義 結構體是使用者更加實際需要自己定義的復合資料型別 如何使用結構體 略 一維陣列 include include intmain void len為一維陣列的長度,可以根據需求動態分配長度 int len pr...

郝斌資料結構4遞迴

1 定義 乙個函式自己直接或間接呼叫自己 2 舉例 include include voidf int n else int main void 執行結果 3 n的階乘用遞迴來實現 3.1 如果不用遞迴來實現 3.2 如果用遞迴來實現 4 1 2 3 100之和用遞迴來實現 4.1 不用遞迴實現 4...

郝斌老師資料結構10(遞迴)

這對你的編碼能力是個質的飛躍,如果你想成為乙個很厲害的程式設計師,資料結構是必須要掌握的,因為計算機專業的本科生也達不到這水平!計算機特別適合用遞迴的思想來解決問題,但是我們人類用遞迴的思想來考慮問題就會感到十分困擾,這也是很多學過遞迴的人一直都搞不明白的地方!那是不是遞迴可以隨便寫,當然不是,有些...