初学数据结构
指針:
指針就是地址 地址就是指針
指針變量是存放內(nèi)存單元地址的變量
指針的本質(zhì)是一個(gè)操作受限的非負(fù)整數(shù)
數(shù)據(jù)結(jié)構(gòu)概述(教材選用嚴(yán)蔚敏、吳偉民,該書(shū)程序是偽算法
具體的程序是高一凡,西電的,大牛,只有
程序。還有一本書(shū),臺(tái)灣的黃國(guó)瑜自己寫(xiě)的
只有思路,程序是另外一個(gè)合作的清華的寫(xiě)
的,可惜很多錯(cuò)的。)
學(xué)完數(shù)據(jù)結(jié)構(gòu)之后會(huì)對(duì)面向過(guò)程的函數(shù)有一個(gè)更深的了解
定義
我們?nèi)绾伟熏F(xiàn)實(shí)中大量而復(fù)雜的問(wèn)題以特定的數(shù)據(jù)類型(單
個(gè)數(shù)據(jù)怎樣存儲(chǔ)?)和特定的存儲(chǔ)結(jié)構(gòu)(個(gè)體的關(guān)系)
保存到主存儲(chǔ)器(內(nèi)存)中,以及在此基礎(chǔ)上為實(shí)現(xiàn)某個(gè)功能
(比如查找某個(gè)元素,刪除某個(gè)元素,對(duì)所有元素進(jìn)行排序)
而執(zhí)行的相應(yīng)操作,這個(gè)相應(yīng)的操作也叫算法。(比如班里有
15個(gè)人,其信息量也許一個(gè)數(shù)組就搞定了,但是假如10000個(gè),
怎么辦?內(nèi)存也許沒(méi)有這么多連續(xù)的空間,所以我們改用鏈表,
you see這就是與存儲(chǔ)有關(guān)系。又比如,人事管理系統(tǒng)的信息存儲(chǔ),
因?yàn)榇嬖谥舷录?jí)的關(guān)系,所以數(shù)組和鏈表就無(wú)能為力了,
這時(shí)候我們用樹(shù),再比如我們做的是交通圖,站和站之間肯定要連通,這
時(shí)候以上的存儲(chǔ)方式又無(wú)能為力了,所以我們又有了圖。圖
就是每個(gè)結(jié)點(diǎn)都可以和其他結(jié)點(diǎn)產(chǎn)生聯(lián)系。所以當(dāng)我們要解決
問(wèn)題時(shí),首先要解決的是如何把這些問(wèn)題轉(zhuǎn)換成數(shù)據(jù),先保存
到我們的主存中,)
算法
解題的方法和步驟
(學(xué)完數(shù)據(jù)結(jié)構(gòu),想用一種語(yǔ)言去實(shí)現(xiàn)它,必須有指針,數(shù)據(jù)結(jié)構(gòu)java
版,就胡扯,變味,因?yàn)槲覀円v鏈表,就是通過(guò)指針鏈在一起的。比如
在java中A aa = new A();本質(zhì)上,aa是個(gè)地址)
預(yù)備知識(shí)
指針
指針的重要性:(內(nèi)存是可以被CPU直接訪問(wèn)的,硬盤(pán)不行
主要靠地址總線,數(shù)據(jù)總線,控制總線。)
指針是C語(yǔ)言的靈魂
定義
地址
地址就是內(nèi)存單元的編號(hào)
從0開(kāi)始的非負(fù)整數(shù)
范圍:0–FFFFFFFF[0-4G-1](地址線是32位,剛好控制2的32次)
指針:
指針就是地址 地址就是指針
指針變量是存放內(nèi)存單元地址的變量
指針的本質(zhì)是一個(gè)操作受限的非負(fù)整數(shù)(不能加乘除,只能減)
分類:
1、基本類型的指針
struct Student st ={1000,”zhanghan ”, 2000};
struct student *pst;
pst = &st;
pst->sid = 99;//pst->sid 等價(jià)與(*pst).sid 而(*pst).sid等價(jià)于st.sid,所以pst->sid 等價(jià)于st.sid
(* pst).sid訪問(wèn)成員只能用.的方式不用->的方式
Strcpy(pst->name,”zhanhan”)
Pst->sid
注意事項(xiàng):
結(jié)構(gòu)體變量不能加減乘除,但可以相互賦值
普通結(jié)構(gòu)體變量和結(jié)構(gòu)體指針變量作為函數(shù)參數(shù)的傳遞
(*pst)是一個(gè)普通結(jié)構(gòu)體變量 pst是結(jié)構(gòu)體指針變量
(病毒就是靠訪問(wèn)正在運(yùn)行的那些程序所占用的內(nèi)存。Java中規(guī)定局部
變量必須初始化,因?yàn)檫@些變量一開(kāi)始都是垃圾值,但是屬性不是必須
初始化的,因?yàn)橐呀?jīng)默認(rèn)初始化為0)
動(dòng)態(tài)內(nèi)存分配和釋放(動(dòng)態(tài)分配的內(nèi)存一定要手動(dòng)釋放,否則造成內(nèi)存
泄露。)
(java中A aa = new A();其實(shí)就是 A *p = (A *)malloc(sizeof(A)))
沒(méi)有使用的就稱為靜態(tài)內(nèi)存,分配了就是動(dòng)態(tài)
#include<stdio.h> #include<malloc.h> int main() {int a[5] = {1,2,3,4,5}就是靜態(tài)內(nèi)存數(shù)組 ,內(nèi)存從開(kāi)始到程序關(guān)閉都存在//動(dòng)態(tài)內(nèi)存分配 ,為什么使用,因?yàn)閿?shù)組的太小未知,使用的時(shí)候不固定,int len;printf("please input your arr len = \n");sccanf("%d",len);int *parr = (int *)malloc(sizeof(int )* len);//請(qǐng)求訪問(wèn)20個(gè)空間的字節(jié) mallco函數(shù)只返回第一個(gè)字節(jié)地址,第一個(gè)字節(jié)地址,不知道要站幾個(gè)字節(jié),就需要強(qiáng)制轉(zhuǎn)換(void *),有了第一個(gè)第一字節(jié)地址大小,后面都是這樣分配 ,這樣parr就等價(jià)a[0]*parr = 4; //類似于a[0] = 4parr[1] = 10; //類似a[1] = 10;//數(shù)組大小的輸入for(int i = 0; i < len; ++i)scanf("%d",&parr[i]);//數(shù)組輸出for(int i = 0; i < len; ++i)printf("%d\n",*(parr+i));free(parr);//釋放內(nèi)存 }***跨函數(shù)使用內(nèi)存問(wèn)題
例子:
所以跨函數(shù)使用的時(shí)候要使用動(dòng)態(tài)內(nèi)存分配
例子
#include<stdio.h> #include<malloc.h> struct Student {int sid;int age; };struct Student * Createstudent(void) //有指針說(shuō)明要返回以動(dòng)態(tài)內(nèi)存地址 {struct Student *p = (struct Student *)(malloc (sizeof(struct Student))); //p是存儲(chǔ)動(dòng)態(tài)內(nèi)存分配的地址p->sid = 99;p->age = 88;return p;//返回它的第一個(gè)地址 } void showstudent(struct Student *pst) {printf("%d %d\n",pst->sid,pst->age); } int main() {struct Student * ps;//這里指向結(jié)構(gòu)體第一個(gè)字節(jié),只占用了4個(gè)字節(jié)//struct Student st;//占用了8個(gè)字節(jié)ps = Createstudent();//ps存放了p的地址,后面函數(shù)使用的時(shí)候直接對(duì)ps 進(jìn)行操作showstudent(ps);//輸出內(nèi)容,傳入第一個(gè)地址return 0; }總結(jié)
- 上一篇: matlab绘制数字滤波器的幅频响应曲线
- 下一篇: MATLAB绘制对数幅频特性