國(guó)家工信部網(wǎng)站備案實(shí)名:湖北自考網(wǎng) 為考生提供湖北自考信息服務(wù),僅供學(xué)習(xí)交流使用,官方信息以湖北教育考試院為準(zhǔn)。
湖北自考在線 湖北學(xué)位英語(yǔ)培訓(xùn)班 湖北成人高考報(bào)名 湖北自考視頻免費(fèi)領(lǐng)取

指針的學(xué)習(xí)方法

湖北自考網(wǎng) 來(lái)源: 時(shí)間:2005-10-23 00:00:00
前言
  
  指針,一直被認(rèn)為是C語(yǔ)言中的精華。只有掌握了指針,你才能說(shuō)你學(xué)會(huì)了C語(yǔ)言。
  
  相當(dāng)初,我是把指針這一章足足看了三遍才算是“學(xué)了這一章”下面的文字是阿容
  
  寫的,對(duì)我學(xué)習(xí)C語(yǔ)言的指針幫助很大。好東西不敢獨(dú)享,今天把它貼出來(lái),希望
  
  大家也會(huì)有所幫助。
  
  第一章。指針的概念?
  
  指針是一個(gè)特殊的變量,它里面存儲(chǔ)的數(shù)值被解釋成為內(nèi)存里的一個(gè)地址。
  
  要搞清一個(gè)指針需要搞清指針的四方面的內(nèi)容:指針的類型,指針?biāo)赶虻?BR>  
  類型,指針的值或者叫指針?biāo)赶虻膬?nèi)存區(qū),還有指針本身所占據(jù)的內(nèi)存區(qū)。讓
  
  我們分別說(shuō)明。
  
  先聲明幾個(gè)指針?lè)胖隼樱?BR>  
  例一:
  
 ?。?)int *ptr;
  
 ?。?)char *ptr;
  
  (3)int **ptr;
  
 ?。?)int (*ptr);
  
 ?。?)int *(*ptr);
  
  如果看不懂后幾個(gè)例子的話,請(qǐng)參閱我前段時(shí)間貼出的文章<<如何理解c和c
  
  ++的復(fù)雜類型聲明>>.
  
  1.指針的類型。
  
  從語(yǔ)法的角度看,你只要把指針聲明語(yǔ)句里的指針名字去掉,剩下的部分就
  
  是這個(gè)指針的類型。這是指針本身所具有的類型。讓我們看看例一中各個(gè)指針的
  
  類型:
  
 ?。?)int *ptr; //指針的類型是int *
  
  (2)char *ptr; //指針的類型是char *
  
  (3)int **ptr; //指針的類型是int **
  
  (4)int (*ptr); //指針的類型是int(*)
  
 ?。?)int *(*ptr); //指針的類型是int *(*)
  
  怎么樣?找出指針的類型的方法是不是很簡(jiǎn)單?
  
  2.指針?biāo)赶虻念愋汀?BR>  
  當(dāng)你通過(guò)指針來(lái)訪問(wèn)指針?biāo)赶虻膬?nèi)存區(qū)時(shí),指針?biāo)赶虻念愋蜎Q定了編譯
  
  器將把那片內(nèi)存區(qū)里的內(nèi)容當(dāng)做什么來(lái)看待。
  
  從語(yǔ)法上看,你只須把指針聲明語(yǔ)句中的指針名字和名字左邊的指針聲明符
  
  *去掉,剩下的就是指針?biāo)赶虻念愋?。例如?BR>  
  (1)int *ptr; //指針?biāo)赶虻念愋褪莍nt
  
  (2)char *ptr; //指針?biāo)赶虻牡念愋褪莄har
  
 ?。?)int **ptr; //指針?biāo)赶虻牡念愋褪莍nt *
  
 ?。?)int (*ptr); //指針?biāo)赶虻牡念愋褪莍nt()
  
  (5)int *(*ptr); //指針?biāo)赶虻牡念愋褪莍nt *()
  
  在指針的算術(shù)運(yùn)算中,指針?biāo)赶虻念愋陀泻艽蟮淖饔谩?BR>  
  指針的類型(即指針本身的類型)和指針?biāo)赶虻念愋褪莾蓚€(gè)概念。當(dāng)你對(duì)C越
  
  來(lái)越熟悉時(shí),你會(huì)發(fā)現(xiàn),把與指針攪和在一起的“類型”這個(gè)概念分成“指針的
  
  類型“和”指針?biāo)赶虻念愋汀皟蓚€(gè)概念,是精通指針的關(guān)鍵點(diǎn)之一。我看了不
  
  少書,發(fā)現(xiàn)有些寫得差的書中,就把指針的這兩個(gè)概念攪在一起了,所以看起書
  
  來(lái)前后矛盾,越看越糊涂。
  
  3.指針的值,或者叫指針?biāo)赶虻膬?nèi)存區(qū)或地址。
  
  指針的值是指針本身存儲(chǔ)的數(shù)值,這個(gè)值將被編譯器當(dāng)作一個(gè)地址,而不是
  
  一個(gè)一般的數(shù)值。在32位程序里,所有類型的指針的值都是一個(gè)32位整數(shù),因?yàn)?BR>  
  32位程序里內(nèi)存地址全都是32位長(zhǎng)。
  
  指針?biāo)赶虻膬?nèi)存區(qū)就是從指針的值所代表的那個(gè)內(nèi)存地址開(kāi)始,長(zhǎng)度為si
  
  zeof(指針?biāo)赶虻念愋停┑囊黄瑑?nèi)存區(qū)。以后,我們說(shuō)一個(gè)指針的值是XX,就相
  
  當(dāng)于說(shuō)該指針指向了以XX為首地址的一片內(nèi)存區(qū)域;我們說(shuō)一個(gè)指針指向了某塊
  
  內(nèi)存區(qū)域,就相當(dāng)于說(shuō)該指針的值是這塊內(nèi)存區(qū)域的首地址。
  
  指針?biāo)赶虻膬?nèi)存區(qū)和指針?biāo)赶虻念愋褪莾蓚€(gè)完全不同的概念。在例一中
  
  ,指針?biāo)赶虻念愋鸵呀?jīng)有了,但由于指針還未初始化,所以它所指向的內(nèi)存區(qū)
  
  是不存在的,或者說(shuō)是無(wú)意義的。
  
  以后,每遇到一個(gè)指針,都應(yīng)該問(wèn)問(wèn):這個(gè)指針的類型是什么?指針指向的
  
  類型是什么?該指針指向了哪里?
  
  4.指針本身所占據(jù)的內(nèi)存區(qū)。
  
  指針本身占了多大的內(nèi)存?你只要用函數(shù)sizeof(指針的類型)測(cè)一下就知道
  
  了。在32位平臺(tái)里,指針本身占據(jù)了4個(gè)字節(jié)的長(zhǎng)度。
  
  指針本身占據(jù)的內(nèi)存這個(gè)概念在判斷一個(gè)指針表達(dá)式是否是左值時(shí)很有用
  
  第二章。指針的算術(shù)運(yùn)算
  
  指針可以加上或減去一個(gè)整數(shù)。指針的這種運(yùn)算的意義和通常的數(shù)值的加減
  
  運(yùn)算的意義是不一樣的。例如:
  
  例二:
  
  1.char a;
  
  2.int *ptr=a;
  
  ……
  
  ……
  
  3.ptr++;
  
  在上例中,指針ptr的類型是int*,它指向的類型是int,它被初始化為指向整
  
  形變量a.接下來(lái)的第3句中,指針ptr被加了1,編譯器是這樣處理的:它把指針
  
  ptr的值加上了sizeof(int),在32位程序中,是被加上了4.由于地址是用字節(jié)做
  
  單位的,故ptr所指向的地址由原來(lái)的變量a的地址向高地址方向增加了4個(gè)字節(jié)。
  
  由于char類型的長(zhǎng)度是一個(gè)字節(jié),所以,原來(lái)ptr是指向數(shù)組a的第0號(hào)單元開(kāi)始的
  
  四個(gè)字節(jié),此時(shí)指向了數(shù)組a中從第4號(hào)單元開(kāi)始的四個(gè)字節(jié)。
  
  我們可以用一個(gè)指針和一個(gè)循環(huán)來(lái)遍歷一個(gè)數(shù)組,看例子:
  
  例三:
  
  例三:
  
  int array;
  
  int *ptr=array;
  
  ……
  
  //此處略去為整型數(shù)組賦值的代碼。
  
  ……
  
  for(i=0;i<20;i++)
  
  {
  
  (*ptr)++;
  
  ptr++;
  
  }
  
  這個(gè)例子將整型數(shù)組中各個(gè)單元的值加1.由于每次循環(huán)都將指針ptr加1,所
  
  以每次循環(huán)都能訪問(wèn)數(shù)組的下一個(gè)單元。
  
  再看例子:
  
  例四:
  
  1.char a;
  
  2.int *ptr=a;
  
  ……
  
  ……
  
  3.ptr+=5;
  
  在這個(gè)例子中,ptr被加上了5,編譯器是這樣處理的:將指針ptr的值加上5
  
  乘sizeof(int),在32位程序中就是加上了5乘4=20.由于地址的單位是字節(jié),故
  
  現(xiàn)在的ptr所指向的地址比起加5后的ptr所指向的地址來(lái)說(shuō),向高地址方向移動(dòng)了
  
  20個(gè)字節(jié)。在這個(gè)例子中,沒(méi)加5前的ptr指向數(shù)組a的第0號(hào)單元開(kāi)始的四個(gè)字節(jié)
  
  ,加5后,ptr已經(jīng)指向了數(shù)組a的合法范圍之外了。雖然這種情況在應(yīng)用上會(huì)出問(wèn)
  
  題,但在語(yǔ)法上卻是可以的。這也體現(xiàn)出了指針的靈活性。
  
  如果上例中,ptr是被減去5,那么處理過(guò)程大同小異,只不過(guò)ptr的值是被減
  
  去5乘sizeof(int),新的ptr指向的地址將比原來(lái)的ptr所指向的地址向低地址方
  
  向移動(dòng)了20個(gè)字節(jié)。
  
  總結(jié)一下,一個(gè)指針ptrold加上一個(gè)整數(shù)n后,結(jié)果是一個(gè)新的指針ptrnew,
  
  ptrnew的類型和ptrold的類型相同,ptrnew所指向的類型和ptrold所指向的類型
  
  也相同。ptrnew的值將比ptrold的值增加了n乘sizeof(ptrold所指向的類型)個(gè)字
  
  節(jié)。就是說(shuō),ptrnew所指向的內(nèi)存區(qū)將比ptrold所指向的內(nèi)存區(qū)向高地址方向移
  
  動(dòng)了n乘sizeof(ptrold所指向的類型)個(gè)字節(jié)。
  
  一個(gè)指針ptrold減去一個(gè)整數(shù)n后,結(jié)果是一個(gè)新的指針ptrnew,ptrnew的類
  
  型和ptrold的類型相同,ptrnew所指向的類型和ptrold所指向的類型也相同。pt
  
  rnew的值將比ptrold的值減少了n乘sizeof(ptrold所指向的類型)個(gè)字節(jié),就是說(shuō)
  
  ,ptrnew所指向的內(nèi)存區(qū)將比ptrold所指向的內(nèi)存區(qū)向低地址方向移動(dòng)了n乘siz
  
  eof(ptrold所指向的類型)個(gè)字節(jié)。
  
  第三章。運(yùn)算符&和*
  
  這里&是取地址運(yùn)算符,*是……書上叫做“間接運(yùn)算符”。
  
  &a的運(yùn)算結(jié)果是一個(gè)指針,指針的類型是a的類型加個(gè)*,指針?biāo)赶虻念愋?BR>  
  是a的類型,指針?biāo)赶虻牡刂仿铮蔷褪莂的地址。
  
  *p的運(yùn)算結(jié)果就五花八門了??傊?p的結(jié)果是p所指向的東西,這個(gè)東西有這
  
  些特點(diǎn):它的類型是p指向的類型,它所占用的地址是p所指向的地址。
  
  例五:
  
  int a=12;
  
  int b;
  
  int *p;
  
  int **ptr;
  
  p=&a;//&a的結(jié)果是一個(gè)指針,類型是int*,指向的類型是int,指向的地址
  
  是a的地址。
  
  *p=24;//*p的結(jié)果,在這里它的類型是int,它所占用的地址是p所指向的地
  
  址,顯然,*p就是變量a.
  
  ptr=&p;//&p的結(jié)果是個(gè)指針,該指針的類型是p的類型加個(gè)*,在這里是int
  
  **.該指針?biāo)赶虻念愋褪莗的類型,這里是int*.該指針?biāo)赶虻牡刂肪褪侵羔?BR>  
  p自己的地址。
  
  *ptr=&b;//*ptr是個(gè)指針,&b的結(jié)果也是個(gè)指針,且這兩個(gè)指針的類型和所
  
  指向的類型是一樣的,所以用&b來(lái)給*ptr賦值就是毫無(wú)問(wèn)題的了。
  
  **ptr=34;//*pt
結(jié)束
本文標(biāo)簽
特別聲明:1.凡本網(wǎng)注明稿件來(lái)源為“湖北自考網(wǎng)”的,轉(zhuǎn)載必須注明“稿件來(lái)源:湖北自考網(wǎng)(trillionsbussines.com)”,違者將依法追究責(zé)任;
2.部分稿件來(lái)源于網(wǎng)絡(luò),如有不實(shí)或侵權(quán),請(qǐng)聯(lián)系我們溝通解決。最新官方信息請(qǐng)以湖北省教育考試院及各教育官網(wǎng)為準(zhǔn)!
限時(shí),免費(fèi)獲取學(xué)歷提升方案

已幫助10w萬(wàn)+意向?qū)W歷提升用戶成功上岸

  • 毛澤東思想概論

    毛澤東思想概論

    培訓(xùn)優(yōu)勢(shì):課時(shí)考點(diǎn)精講+刷題+沖刺,熟練應(yīng)對(duì)考試題型。全程督促學(xué)習(xí),安排好學(xué)習(xí)計(jì)劃。 毛澤東思想概論...自考培訓(xùn)
  • 英語(yǔ)二

    英語(yǔ)二

    本課程既是一門語(yǔ)言實(shí)踐課程,也是拓寬知識(shí)、了解世界文化的重要素質(zhì)課程,它以培養(yǎng)學(xué)習(xí)者的綜合語(yǔ)言應(yīng)用能力為目標(biāo),使他們?cè)趯W(xué)習(xí)、工作和社會(huì)交往中能夠使用英語(yǔ)進(jìn)行有效的交流。 英語(yǔ)二...自考培訓(xùn)
  • 馬克思主義基本原理概論

    馬克思主義基本原理概論

    本書包括兩個(gè)部分:自學(xué)考試大綱和基本原理。主要內(nèi)容有,馬克思主義是關(guān)于工人階級(jí)和人類解放的科學(xué),物質(zhì)世界及其發(fā)展規(guī)律,認(rèn)識(shí)的本質(zhì)及其規(guī)律,人類社會(huì)及其發(fā)展規(guī)律,資本主義的形成及其發(fā)展,資本主義發(fā)展的歷史進(jìn)程,社會(huì)主義社會(huì)及其進(jìn)程,共產(chǎn)主義社會(huì)及其進(jìn)程等。 馬克思主義基本原理概論...自考培訓(xùn)
  • 思想道德修養(yǎng)與法律基礎(chǔ)

    思想道德修養(yǎng)與法律基礎(chǔ)

    《思想道德修養(yǎng)與法律基礎(chǔ)》課具有鮮明的政治性、思想性、理論性、針對(duì)性、科學(xué)性、知識(shí)性以及實(shí)踐性和修養(yǎng)性。它包羅政治、思想、道德、心理本質(zhì)、學(xué)習(xí)成才和法律本質(zhì)等內(nèi)容,指導(dǎo)和回答大學(xué)生在人生、抱負(fù)、信念等方面遍及關(guān)心和迫切需要解決的問(wèn)題。 思想道德修養(yǎng)與法律基礎(chǔ)...自考培訓(xùn)
  • 中國(guó)近代史綱要

    中國(guó)近代史綱要

    “中國(guó)近現(xiàn)代史綱要”全國(guó)高等教育自學(xué)考試指定教材,依據(jù)中央審定的普通高等學(xué)?!爸袊?guó)近現(xiàn)代史綱要”編寫大綱以及馬克思主義理論研究和建設(shè)工程重點(diǎn)教材《中國(guó)近現(xiàn)代史綱要》,結(jié)合自學(xué)考試的特點(diǎn)設(shè)計(jì)了十章,集中講述1840年鴉片戰(zhàn)爭(zhēng)爆發(fā)一直到2007年中國(guó)共產(chǎn)黨第十七次全國(guó)代表大會(huì)召開(kāi)的160多年的中國(guó)近現(xiàn)代歷史。 中國(guó)近代史綱要...自考培訓(xùn)
微信公眾號(hào) 考試交流群
湖北自考網(wǎng)微信公眾號(hào)

掃一掃關(guān)注微信公眾號(hào)

隨時(shí)獲取湖北省自考政策、通知、公告以及各類學(xué)習(xí)資料、學(xué)習(xí)方法、課程。