性无码一区二区三区在线观看,少妇被爽到高潮在线观看,午夜精品一区二区三区,无码中文字幕人妻在线一区二区三区,无码精品国产一区二区三区免费

  • 回復(fù)
  • 收藏
  • 點(diǎn)贊
  • 分享
  • 發(fā)新帖

PICC與指針

1:指針?biāo)囊兀ㄟ@部分主要從網(wǎng)上搜索到的,還不錯(cuò)):

指針的類(lèi)型

指針?biāo)赶虻念?lèi)型

指針的值或者叫指針?biāo)赶虻膬?nèi)存區(qū)

指針本身所占據(jù)的內(nèi)存區(qū)

1 指針的類(lèi)型。

從語(yǔ)法的角度看,你只要把指針聲明語(yǔ)句里的指針名字去掉,剩下的部分就是這個(gè)指針的類(lèi)型。這是指針本身所具有的類(lèi)型。讓我們看看例一中各個(gè)指針的類(lèi)型:

(1)int *ptr; //指針的類(lèi)型是int *

(2)char *ptr; //指針的類(lèi)型是char *

(3)int **ptr; //指針的類(lèi)型是 int **

(4)int (*ptr)[3]; //指針的類(lèi)型是 int(*)[3]

(5)int *(*ptr)[4]; //指針的類(lèi)型是 int *(*)[4]

怎么樣?找出指針的類(lèi)型的方法是不是很簡(jiǎn)單?

1 .2指針?biāo)赶虻念?lèi)型。

當(dāng)你通過(guò)指針來(lái)訪(fǎng)問(wèn)指針?biāo)赶虻膬?nèi)存區(qū)時(shí),指針?biāo)赶虻念?lèi)型決定了編譯器將把那片內(nèi)存區(qū)里的內(nèi)容當(dāng)做什么來(lái)看待。從語(yǔ)法上看,你只須把指針聲明語(yǔ)句中的指針名字和名字左邊的指針聲明符*去掉,剩下的就是指針?biāo)赶虻念?lèi)型。例如:

(1)int *ptr; //指針?biāo)赶虻念?lèi)型是int

(2)char *ptr; //指針?biāo)赶虻牡念?lèi)型是char

(3)int **ptr; //指針?biāo)赶虻牡念?lèi)型是 int *

(4)int (*ptr)[3]; //指針?biāo)赶虻牡念?lèi)型是 int()[3]

(5)int *(*ptr)[4]; //指針?biāo)赶虻牡念?lèi)型是 int *()[4]

在指針的算術(shù)運(yùn)算中,指針?biāo)赶虻念?lèi)型有很大的作用。

指針的類(lèi)型(即指針本身的類(lèi)型)和指針?biāo)赶虻念?lèi)型是兩個(gè)概念。當(dāng)你對(duì)C越來(lái)越熟悉時(shí),你會(huì)發(fā)現(xiàn),把與指針攪和在一起的"類(lèi)型"這個(gè)概念分成"指針的類(lèi)型"和"指針?biāo)赶虻念?lèi)型"兩個(gè)概念,是精通指針的關(guān)鍵點(diǎn)之一。

1.3指針的值,或者叫指針?biāo)赶虻膬?nèi)存區(qū)或地址。

指針的值是指針本身存儲(chǔ)的數(shù)值,這個(gè)值將被編譯器當(dāng)作一個(gè)地址,而不是一個(gè)一般的數(shù)值。在32位程序里,所有類(lèi)型的指針的值都是一個(gè)32位整數(shù),因?yàn)?2位程序里內(nèi)存地址全都是32位長(zhǎng)。

指針?biāo)赶虻膬?nèi)存區(qū)就是從指針的值所代表的那個(gè)內(nèi)存地址開(kāi)始,長(zhǎng)度為sizeof(指針?biāo)赶虻念?lèi)型)的一片內(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)赶虻念?lèi)型是兩個(gè)完全不同的概念。在例一中,指針?biāo)赶虻念?lèi)型已經(jīng)有了,但由于指針還未初始化,所以它所指向的內(nèi)存區(qū)是不存在的,或者說(shuō)是無(wú)意義的。

以后,每遇到一個(gè)指針,都應(yīng)該問(wèn)問(wèn):這個(gè)指針的類(lèi)型是什么?指針指向的類(lèi)型是什么?該指針指向了哪里?

1.4指針本身所占據(jù)的內(nèi)存區(qū)。

指針本身占了多大的內(nèi)存?你只要用函數(shù)sizeof(指針的類(lèi)型)測(cè)一下就知道了。在32位平臺(tái)里,指針本身占據(jù)了4個(gè)字節(jié)的長(zhǎng)度。指針本身占據(jù)的內(nèi)存這個(gè)概念在判斷一個(gè)指針表達(dá)式是否是左值時(shí)很有用。(注釋?zhuān)涸趐icc18里,指針占用了兩個(gè)字節(jié))

下面就picc18列舉個(gè)實(shí)例看下面程序

intdata[10]={1,2,4,5,6,7,8};

intlenth1,lenth2,lenth3;

int*ptr1,*ptr2;

main()

{

ptr1=&data[0];

ptr2=&data[1];

lenth1=ptr2-ptr1;

lenth2=(int)ptr2-(int)ptr1;

lenth3=*ptr2-*ptr1;

}

在watch窗口可以看到lenth1 為1,而lenth2為2,可以這樣解釋?zhuān)涸趌enth1=ptr2-ptr1;這條語(yǔ)句中兩個(gè)INT類(lèi)型指針變量相減得一個(gè)(這在c中是允許的)非指針的數(shù),這個(gè)數(shù)的代表如下:

如果這兩個(gè)指針指向的內(nèi)型為INT型,那么這個(gè)數(shù)代表兩個(gè)指針之間相隔多少個(gè)INT型變量,顯然在以上程序中,data[0],和data[1]之間相隔了1個(gè)INT型變量。

而在 lenth2=(int)ptr2-(int)ptr1;實(shí)際上是求data[1]和data[0]之間占用多少個(gè)內(nèi)存空間,注意(int)ptr是ptr的值(不是ptr所指向的數(shù)的值)

lenth3=*ptr2-*ptr1;相信稍微懂c的人都知道是在求ptr所指向的兩個(gè)值之間的差,和lenth3=data[1]-data[0]等效。

大家不防試試lenth4=(char*)ptr2-(char*)ptr1;看看等于多少,

2: 指針函數(shù)和函數(shù)指針有什么區(qū)別

2.1,這兩個(gè)概念都是簡(jiǎn)稱(chēng),指針函數(shù)是指帶指針的函數(shù),即本質(zhì)是一個(gè)函數(shù)。我們知道函數(shù)都又返回類(lèi)型(如果不返回值,則為無(wú)值型),只不過(guò)指針函數(shù)返回類(lèi)型是某一類(lèi)型的指針。其定義格式如下所示:

返回類(lèi)型標(biāo)識(shí)符 *返回名稱(chēng)(形式參數(shù)表)

{ 函數(shù)體 }

返回類(lèi)型可以是任何基本類(lèi)型和復(fù)合類(lèi)型。返回指針的函數(shù)的用途十分廣泛。事實(shí)上,每一個(gè)函數(shù),即使它不帶有返回某種類(lèi)型的指針,它本身都有一個(gè)入口地址,該地址相當(dāng)于一個(gè)指針。比如函數(shù)返回一個(gè)整型值,實(shí)際上也相當(dāng)于返回一個(gè)指針變量的值,不過(guò)這時(shí)的變量是函數(shù)本身而已,而整個(gè)函數(shù)相當(dāng)于一個(gè)“變量”。例如下面一個(gè)返回指針函數(shù)的例子:

chardata[10];

char*test(void);

main()

{

char *ptr;

ptr=test();

}

char* test(void)

{

char *p;

p=data;

return p;

}

注意:該程序在picc18中調(diào)試

2.2,“函數(shù)指針”是指向函數(shù)的指針變量,因而“函數(shù)指針”本身首先應(yīng)是指針變量,只不過(guò)該指針變量指向函數(shù)。這正如用指針變量可指向整型變量、字符型、數(shù)組一樣,這里是指向函數(shù)。如前所述,C在編譯時(shí),每一個(gè)函數(shù)都有一個(gè)入口地址,該入口地址就是函數(shù)指針?biāo)赶虻牡刂贰S辛酥赶蚝瘮?shù)的指針變量后,可用該指針變量調(diào)用函數(shù),就如同用指針變量可引用其他類(lèi)型變量一樣,在這些概念上一致的。函數(shù)指針有兩個(gè)用途:調(diào)用函數(shù)和做函數(shù)的參數(shù)。函數(shù)指針的說(shuō)明方法為:

數(shù)據(jù)類(lèi)型標(biāo)志符 (*指針變量名)(參數(shù));注:函數(shù)括號(hào)中的參數(shù)可有可無(wú),視情況而定。

下面的程序說(shuō)明了函數(shù)指針調(diào)用函數(shù)的方法:

charmax(char x,char y);

char min(char x,char y);

char (*ptr)(char,char);

char a=2,b=3,c;

main()

{

ptr=max;

c=(*ptr)(a,b);

ptr=min;

c=(*ptr)(a,b);

}

char max(char x,char y)

{

return x>=y?x:y;

}

char min(char x,char y)

{

return x<=y?x:y;

}

注意:該程序在picc18中調(diào)試

在pic的c程序編寫(xiě)中,函數(shù)指針不是很常用,如果大家有興趣看看UCOS的pic18的移植版本,就可以發(fā)現(xiàn)ucos中是用函數(shù)指針傳遞任務(wù)程序的入口地址的。

3:結(jié)構(gòu)聯(lián)合與指針

先看下面的一個(gè)簡(jiǎn)單的舉例

typedef struct datas

{

char datah;

char datal;

struct datas*next;

} data;

//a是一個(gè)結(jié)構(gòu)變量

dataa,b;

data*ptr1,*ptr2;

main()

{

ptr1=&a;

ptr1->datah =1;

ptr1->datal =2;

ptr2=&b;

ptr1->datah =3;

ptr1->datal =4;

ptr1->next=ptr2;

ptr2->next=0;

}

數(shù)據(jù)a,b是一個(gè)結(jié)構(gòu)型變量,ptr則是指向結(jié)構(gòu)型變量的指針,在c語(yǔ)言里,通過(guò)形如ptr->x的形式來(lái)訪(fǎng)問(wèn)結(jié)構(gòu)或者指針的成員。

在結(jié)構(gòu)變量中定義了一個(gè)指針struct datas*next; 這是在指針鏈中常用到的,ptr1->next=ptr2;ptr2->next=0;實(shí)際上已經(jīng)建立了一條簡(jiǎn)單的指針鏈,當(dāng)然建立指針鏈用這種初始化的方法不夠簡(jiǎn)單,但是上面的程序只是為了說(shuō)明指針和結(jié)構(gòu)而已。

在單片機(jī)的c語(yǔ)言程序中,聯(lián)合和結(jié)構(gòu)是經(jīng)常用在一起的下面在舉一個(gè)簡(jiǎn)單的列子:

typedef struct

{

char datah;

char datal;

} data;

typedefunion

{

datatwpbyte;

intbytes;

} piccdata;

piccdataadres[10];

piccdata*ptr1,*ptr2;

charlenth1,lenth2;

main()

{

ptr2=adres;

ptr1=adres;

ptr1++;

lenth1=ptr1-ptr2;

lenth2=(char)ptr1-(char)ptr2;

}

在以上程序中,lenth2為2,而lenth1為1,道理和第一個(gè)列子一樣,只是應(yīng)該注意的是在piccdata型變量中占用的空間為2個(gè)字節(jié)而不是4個(gè)字節(jié)?。?!

另:結(jié)構(gòu)與聯(lián)合是pic應(yīng)用的一個(gè)好東西,這點(diǎn)HOTpower曾經(jīng)有一很經(jīng)典的文章,在此列中,只要稍微加以改動(dòng),就可以對(duì)一個(gè)16位變量即可以整體訪(fǎng)問(wèn),也可分為高八位訪(fǎng)問(wèn)和低八位訪(fǎng)問(wèn)。這在ad轉(zhuǎn)換中是很有用的。

4:const與指針

const是一個(gè)C語(yǔ)言的關(guān)鍵字,它限定一個(gè)變量不允許被改變。如果const關(guān)鍵字不涉及到指針,我們很好理解,下面是涉及到指針的情況:

int b = 500;

const int* a = &b;[1]

int const *a = &b;[2]

Int* const a = &b;[3]

const int* const a = &b;[4]

如果const位于星號(hào)的左側(cè),則const就是用來(lái)修飾指針?biāo)赶虻淖兞?,即指針指向?yàn)槌A?;如果const位于星號(hào)的右側(cè),const就是修飾指針本身,即指針本身是常量。因此,[1]和[2]的情況相同,都是指針?biāo)赶虻膬?nèi)容為常量(const放在變量聲明符的位置無(wú)關(guān)),這種情況下不允許對(duì)內(nèi)容進(jìn)行更改操作,如不能*a = 3 ;[3]為指針本身是常量,而指針?biāo)赶虻膬?nèi)容不是常量,這種情況下不能對(duì)指針本身進(jìn)行更改操作,如a++是錯(cuò)誤的;[4]為指針本身和指向的內(nèi)容均為常量。

有了上面的基礎(chǔ),對(duì)于在picc18中的c語(yǔ)言應(yīng)用就可以開(kāi)始了,在單片機(jī)編程中,經(jīng)常會(huì)用到查表程序等,通常把大量的數(shù)據(jù)放入rom中,下面是一個(gè)簡(jiǎn)單的列子

const int a[8]={1,2,3,-3,3,5,6,7};

const int *ptr;

main()

{

ptr=a;

ptr++;

}

顯然ptr是一個(gè)指向常量的指針,ptr指向的數(shù)是不可變的,但是ptr本身是可變的,我們可以通過(guò)ptr來(lái)訪(fǎng)問(wèn)定義在rom中的數(shù)組a[8];

原文地址:http://www.umstar1.com/html/rmwz/dpj/84.html

全部回復(fù)(0)
正序查看
倒序查看
現(xiàn)在還沒(méi)有回復(fù)呢,說(shuō)說(shuō)你的想法
發(fā)