C語言數(shù)組與指針詳解_第1頁
C語言數(shù)組與指針詳解_第2頁
C語言數(shù)組與指針詳解_第3頁
C語言數(shù)組與指針詳解_第4頁
C語言數(shù)組與指針詳解_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

好多同學(xué)都說:“老師,我看到指針就暈!”,說實(shí)話,見過暈血的,見過暈車的,暈指針的到是第一次聽說!

我們先來分析一下暈車的原理,再來對(duì)比一下為什么暈指針。

暈車,是因?yàn)槎淅锏囊粋€(gè)器官對(duì)外界的振動(dòng)太敏感,導(dǎo)致身體調(diào)節(jié)功能紊亂,系統(tǒng)不能正常工作,輕則,暈點(diǎn),中則,吐點(diǎn),重則,“重啟”(倒地)。時(shí)間長(zhǎng)了,知道自己暈車,于是,看到公交車,TAXI,火車,自行車,都暈!這樣的病就大了,上升到心理疾病了。這可得治。我們都明白上面的道理,怎么克服暈車呢?你不可能避免做車,你要去面對(duì),怎么克服暈車也很簡(jiǎn)單,先是功心,“口服不如心服”,所以先治心?。航⑿判?。經(jīng)常試著去做晃動(dòng)不大的車,最好聽著MP3,這樣能減緩心理對(duì)暈車的敏感度。時(shí)間長(zhǎng)了,慢慢的克服了心理作用,然后就要上升到治根的階段了,要去試著挑戰(zhàn)做公交,TAXI,船。

上面都是個(gè)人的一些見解,上大學(xué)時(shí),要是不學(xué)計(jì)算機(jī)就去學(xué)醫(yī)了!白衣王子嗎(天使算不上,爺們嗎,王子就行了)。

回來我們開始治“暈指針”這號(hào)病,其實(shí)很多同學(xué)暈指針,也是因?yàn)樽约夯A(chǔ)不好(身體素質(zhì)不好),剛開始學(xué)的時(shí)候,不用心,還沒有弄的很明白,一編程(有的同學(xué)4年都沒編過一個(gè)程序)就錯(cuò),形成了恐懼心理,其實(shí)C指針非常靈活,它對(duì)學(xué)生的要求也比較高,說白了,它要求有計(jì)算機(jī)的組成原理一些基礎(chǔ),如果有的話,你回頭看指針,Soeasy!

我們先開始“攻心”。

1.

暈指針,唐式偏方一:“投石問路”#include<stdio.h>intmain(void){

char*str="ABCDEFGHIJKL";

int*pInt=(int*)str;

printf("%c\n%c\n",*(str+1),*(char*)(pInt+1));

return0;}

上面的程序如果你要是灰常EASY的回答出來,那你的功底已經(jīng)不錯(cuò)了!心病是估計(jì)沒有了,可以進(jìn)入吃藥保養(yǎng)階段了(做題)。如果上面的題看起來就特別費(fèi)勁,看來你暈的不輕,得治。要不問題會(huì)很嚴(yán)重。

基于上面的小測(cè)試,進(jìn)入唐式第二方:“理氣靜心”

我們先看把C指針的基礎(chǔ)打好。在這之前先來復(fù)習(xí)下變量和常量,有的同學(xué)會(huì)問,這是為什么,我只能告訴你,你暈C指針,是因?yàn)槟銖膭傞_始有問題就沒有重視,或者你忽略了問題的嚴(yán)重性,導(dǎo)致現(xiàn)在的情況,這也沒有辦法,中國的教育就不重視這一塊,說實(shí)話,大學(xué)里講C語言的,很多都沒有太多的講到變量和常量,這是很XXX的。我們開始治療。

常量:其值不發(fā)生改變的量稱謂常量。常量又稱為字面量,表述常數(shù)。它們可以和數(shù)據(jù)類型結(jié)合起來分類,比如:整形常量,浮點(diǎn)型常量,字符常量==,常量是可以不經(jīng)過定義和初始化,而直接引用的。常量又分為:直接常量和符號(hào)常量。直接常量又叫做:字面常量。如12,0,4.6,‘a(chǎn)‘,“abcd”符號(hào)常量如宏定義的:#definePI3.14特點(diǎn):常量的值在其作用域內(nèi)不會(huì)發(fā)生改變,也不能再被賦值。其在出現(xiàn)時(shí)就被當(dāng)作一個(gè)立即數(shù)來使用。也就是說,只能被訪問,被讀,而不能被寫,被賦值。

變量:其值可以改變的量稱這變量。一個(gè)變量應(yīng)該有一個(gè)名字,在內(nèi)存中占據(jù)一定的存儲(chǔ)單元。變量在使用前必須要定義。

變量名和變量的值:變量名是在,變量的聲明的時(shí)候,該名字就和內(nèi)存中一塊地址綁定在一起了??梢酝ㄟ^變量名直接找到對(duì)應(yīng)的內(nèi)存區(qū)域,也可以通過地址找到其內(nèi)存區(qū)域。因此有了引入指針的依據(jù)。變量的值是變量所對(duì)應(yīng)的內(nèi)存區(qū)域內(nèi)存放的二進(jìn)制序列。當(dāng)該變量被聲明成整形時(shí),內(nèi)存區(qū)域的二進(jìn)制序列被以整形的形式翻譯出來。比如:inta=97;其在內(nèi)存中是以97的二進(jìn)制形式存放的,當(dāng)使用時(shí),他會(huì)被以10進(jìn)制形式表現(xiàn)出來。同樣的chara=‘a(chǎn)’;a的ASIIC碼是97,也是以97的二進(jìn)制存放的,使用時(shí),會(huì)被以字符a的形式表現(xiàn)出來。如果變量是一個(gè)指針變量,那么指針變量里的二進(jìn)制序列被翻譯成一個(gè)地址,比如:

inta=10;

int*p;

p=&a;這里的指針變量p的值是a的地址(p=&a),它是什么啊?看下圖:(說實(shí)話哥們圖畫的不錯(cuò),大學(xué)自學(xué)過PS,還TMD的拿過獎(jiǎng))聲明了一個(gè)變量a,它是整型,被賦值為10(它的值被翻譯成整數(shù)),要形成這種思維,時(shí)間長(zhǎng)了你就知道這樣做的好處了,又聲明了一個(gè)指針變量p,它是Int類型的(它指向的地址里面要裝Int),然后將a變量的地址(ox2c406b24)給了p,這兒注意下。現(xiàn)在訪問a里面的值有了兩種方式(其實(shí)本來也有這兩種),一個(gè)是通過變量名a(綁定的),一個(gè)是通過地址ox2c406b24,地址ox2c406b24給了p了,p指針變量(指針變量是變量,這個(gè)思維很重要)里面存放的是ox2c406b24(a的地址),那么現(xiàn)在訪問a可以通過:

printf("%d\n",a);

//通過變量名

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

//通過指針變量如果你現(xiàn)在上面的都很明白了,那你有了暈指針好轉(zhuǎn)的跡象,只是跡象,(跡象だけです^_^)?,F(xiàn)在驗(yàn)證下是不是真的有好轉(zhuǎn):

1、charch='a';inta=(int)ch;printf("%d%c\n",a,ch);ch是什么?ch里面是什么?a是什么?a里面又是什么?打印什么?2、intadd=0x123456;int*p=(int*)add;add是什么?add里是什么?P是什么?P里面是什么?*p又是什么?嘿嘿,暈不?別慌,再來。。。3、#definePI3.14inta=PI;printf("%d\n",a);上面的程序有沒有問題?4、#definePI3.14printf("%d\n",PI);程序有沒有問題?5、#definePI3.14inta=PI;PI=1.85;

intb=PI;printf("%d%d\n",a,b);程序有沒有問題?

差不多頭疼的不行了吧,沒事,這是藥勁,好藥都這樣。最后一個(gè):6、char*str="abcdef";printf("%s\n",str);*str="fedcba";printf("%s\n",str);str[2]='C';

//修改第三個(gè)字符為大寫printf("%s\n",str);程序有沒有問題?好,第一方到此為止,老中醫(yī)要休息會(huì)。

上一方藥勁比較重,年輕人嗎,口味要重點(diǎn)?,F(xiàn)在給你們點(diǎn)解藥:1、主要是測(cè)試類型轉(zhuǎn)換,還有對(duì)變量的理解是否到位。2、對(duì)變量的值的理解是否到位3、對(duì)常量,宏替換的理解是否到位4、對(duì)宏替換的理解是否到位5、能否修改常量的值?6、能否修改字符串常量的值?通過上面我們可以學(xué)到以下內(nèi)容,重點(diǎn),記下,考試要考(這話在學(xué)校里很耳熟,但是XXX的這樣很不負(fù)責(zé)任):

1、不管什么常量,其值是編譯是固定好的,不能再被改變

2、變量里的值,和其數(shù)據(jù)類型沒有關(guān)系,它只是一個(gè)二進(jìn)制序列,不要將電腦想的多聰明,它只認(rèn)識(shí)0,1,只不過,這一堆01被其類型限定了其代表的意義,類型為整形就是其值,指針地址類型,就是內(nèi)存里的一個(gè)地址,字符型,就是其無符號(hào)整形代表的ASCII碼。

3、字符串,是常量(字符指針指向一字符串,不是數(shù)組,數(shù)組和指針的區(qū)別在后面),其值不能再被改變,char*str="abcdef";這行代碼的意思是告訴編譯器:老編啊,我這兒有個(gè)抽屜(指針變量str),你給我找個(gè)房間(存放字符串的內(nèi)存空間),找到后,把鑰匙給我放到這個(gè)抽屜里。老編去找客房經(jīng)理,找到后問:有沒有空房間啊,有的話給我一間,一哥們要開房,客房經(jīng)理去查房間入住情況(內(nèi)存管理),最后說,這兒有一間,它是老總的房間,你要不先用著,你用沒事,你可別亂動(dòng)里面的東西,你要是動(dòng)的話,估計(jì)你那哥們就被KILL掉,老板是黑社會(huì)的,不過,你用沒事。于是,老編將老總房間鑰匙給我放到了抽屜(指針變量str)里,這樣,我打開抽屜(指針變量),拿出房間(內(nèi)存空間)鑰匙(指針),去開房了,老編告訴的,別亂動(dòng),用沒事(讀?。?,一定不能破壞里面的結(jié)構(gòu)(修改數(shù)據(jù)內(nèi)容),要是亂動(dòng)(修改數(shù)據(jù)),會(huì)出亂子的(段錯(cuò)誤),然后你會(huì)被KILL的(異常結(jié)束程序)。如果有兩個(gè)人,就會(huì)Doublekill,老板就GODLIKE了。

明白了常量和變量的區(qū)別后,再進(jìn)行后面的學(xué)習(xí)就輕松點(diǎn)了!下面我們來看下指針的雙胞胎哥們,數(shù)組。一般暈車人里面有很多也暈飛機(jī),暈船,所以呢,暈指針的,也一般都會(huì)暈數(shù)組。

數(shù)組:我們先咬文嚼字一下,數(shù)指數(shù)據(jù),組,就是小組,由數(shù)據(jù)組成的小組,就叫數(shù)組(學(xué)計(jì)算機(jī)的,不光要學(xué)好計(jì)算機(jī),也要學(xué)好語文,偶爾還要懂點(diǎn)醫(yī)學(xué),你要是經(jīng)常看計(jì)算機(jī)圖書,你看臺(tái)灣人寫的書,都有很多文言文在里面,我們這點(diǎn)做的完全沒有臺(tái)胞做的好,所以人家計(jì)算機(jī)牛啊,世界上的電子代工,臺(tái)灣占了絕大數(shù)比例)。數(shù)組有幾個(gè)特點(diǎn)一定要注意,看到數(shù)組就要想到:1、

數(shù)組里面的數(shù)據(jù)類型是相同的,小組里面的成員肯定要一樣的啊,驢堆里站一馬,驢馬不分,雞窩里蹲一丹頂鶴,鶴立雞群,這都是不合群的東西,計(jì)算機(jī)里面也講“和諧”。我們順便看下數(shù)據(jù)的基本類型:intfloatdoublechar這些是基本類型,所以它們可以存在以下類似數(shù)組:inta[10],floatf[10],douled[10],charstr[10];它們每一個(gè)都有10個(gè)元素,每一個(gè)元素的類型都是其前面聲明的類型。我們是學(xué)嵌入式的,我們不能光看到表面的東西,我們要看到底,好東西是走了光才叫好,光有好東西,別人不知道也不行。其實(shí)數(shù)組在內(nèi)存中是連續(xù)分配的,如下圖:定義了一char型數(shù)組a,它有6個(gè)元素,分別是'A','B','C','D','E','F',它們?cè)趦?nèi)存里面是連續(xù)存放的,每個(gè)元素占用一個(gè)字節(jié)。強(qiáng)烈譴責(zé)那些將'A'當(dāng)成"A"的人,前者是單個(gè)字符,后者是字符串,鄙視那些,問“字符和字符串有什么區(qū)別?”的人,不知道字符和字符串的區(qū)別,那你吃過羊肉串嗎?單個(gè)羊肉塊能叫串嗎,多個(gè)羊肉塊串起來才叫串,所以字符是單個(gè),字符串可以是多個(gè)字符組成的數(shù)組(最后有一個(gè)結(jié)束符號(hào)\0),羊肉塊串起來一烤就叫烤羊肉串,字符串一拷,叫拷貝串,學(xué)計(jì)算機(jī)哪有那么簡(jiǎn)單,要是我開個(gè)學(xué)校,入學(xué)前要體檢,測(cè)視力,量身高體重,....,三圍什么的,不行的PASS。

仔細(xì)看上面的圖,每一個(gè)字符都有一個(gè)地址,它們的跨度是1(字節(jié)),數(shù)組的每個(gè)元素都可以通過下標(biāo)來訪問,下標(biāo)(index,for循環(huán)變量經(jīng)常用i就是因?yàn)檫@個(gè)東西)其實(shí)就是他在數(shù)組中的位置,也就是他的號(hào),拉10個(gè)人過來,報(bào)數(shù),1,2,3.....,只不過,C語言里數(shù)組的下標(biāo)是從0開始的,在計(jì)算機(jī)里面能訪問的最小單位就是字節(jié)了,也就是地址只能找到以字節(jié)為單位,不能再精確了。數(shù)組名a和變量名道理上是一樣的,在編譯時(shí)就和數(shù)組的首地址綁定上了,a就是數(shù)組的首地址,變量名和數(shù)組名其實(shí)都是方便人們記憶而取的代號(hào),它在代碼反匯編后,其實(shí)不存在變量名的,回想下,訪問數(shù)據(jù)有兩種方式,既然反匯編后的代碼不存在變量名,只能通過那種方式訪問數(shù)據(jù)了,那就是地址。數(shù)組中的每一個(gè)元素,可以被看成一個(gè)變量(回想下變量的特點(diǎn)),因此其可以被讀,寫,修改,愛怎么得瑟怎么得瑟,你只要不把房間拆了(內(nèi)存空間),怎么折騰都行。每一個(gè)元素的地址都可以通過首地址的偏移量(offset這個(gè)詞記住,四級(jí)里沒有)來算出來,這個(gè)偏移量說白了就是下標(biāo)了。比如上面的圖中:'C'所在地址0x28c5,相對(duì)首地址0x28c3的偏移量是2,那a[2]也可以訪問'C'了,注意一點(diǎn),a代表數(shù)組,代表數(shù)組的首地址,代表數(shù)組第一個(gè)元素的地址,這“三個(gè)代表”一定要記住。那a+1呢,a是三個(gè)代表,那它是第一代表還是第二個(gè)代表,還是第三個(gè)代表呢?這兒的a應(yīng)該是第一個(gè)元素地址的意思表示的意思應(yīng)該是&a[0],a+1是個(gè)地址的算術(shù)運(yùn)算,而數(shù)組是個(gè)一維數(shù)組,數(shù)組中每個(gè)元素都是一個(gè)字符,a+1就是a當(dāng)前地址0x28c3的下一個(gè)元素的地址0x28c4(結(jié)合圖來看),也就是'B'的地址,如果a是一個(gè)二維數(shù)組名的話,那么二維數(shù)組被編譯器理解為一個(gè)一維數(shù)組,一維數(shù)組里的每一個(gè)元素是一個(gè)一維數(shù)組,有點(diǎn)亂,別慌,屢一下,看下圖:a是個(gè)二維數(shù)組,它有3X4=12個(gè)字符元素,而編譯器將它認(rèn)為是一個(gè)一維數(shù)組,它有三個(gè)元素,分別是a[0],a[1],a[2],每一個(gè)元素是一個(gè)含有4個(gè)字符的數(shù)組,那么a+1的話,是&a[0]的地址,a[0]是一個(gè)一給數(shù)組,取了一個(gè)數(shù)組的地址,再加1,肯定就是下一個(gè)數(shù)組的地址了,就是a[1]上圖,那么這個(gè)時(shí)候它的地址增加可不再是1了,而是列數(shù)4,也就是說是a這個(gè)二維數(shù)組中元素(一維數(shù)組)的長(zhǎng)度。

回到前面那個(gè)圖:a[5]-a[3]=?地址的運(yùn)算,這里算的也是元素的相對(duì)偏移量,結(jié)果當(dāng)然是2,雖然0x28c8-0x28c6=2結(jié)果也是2,不過意義不一樣,如果數(shù)組類型換成inta[10],那么a[5]-a[3]還是2,不是8,這個(gè)直接用下標(biāo)相減就對(duì)了。

因此我們可以總結(jié)一下,指針相加減時(shí),要看類型,打狗看主人,指針加減

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論