音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng)
驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe

PICC與指針,歡迎拍磚

作者:手扶拖拉機 欄目:單片機
PICC與指針,歡迎拍磚
                           PICC與指針
1:指針?biāo)囊兀ㄟ@部分主要從網(wǎng)上搜索到的,還不錯):
指針的類型
指針?biāo)赶虻念愋?br>指針的值或者叫指針?biāo)赶虻膬?nèi)存區(qū)
指針本身所占據(jù)的內(nèi)存區(qū)
1 指針的類型。
從語法的角度看,你只要把指針聲明語句里的指針名字去掉,剩下的部分就
是這個指針的類型。這是指針本身所具有的類型。讓我們看看例一中各個指針的
類型:
(1)int *ptr; //指針的類型是int *
(2)CHAR *ptr; //指針的類型是CHAR *
(3)int **ptr; //指針的類型是 int **
(4)int (*ptr)[3]; //指針的類型是 int(*)[3]
(5)int *(*ptr)[4]; //指針的類型是 int *(*)[4]
怎么樣?找出指針的類型的方法是不是很簡單?

1 .2指針?biāo)赶虻念愋汀?
當(dāng)你通過指針來訪問指針?biāo)赶虻膬?nèi)存區(qū)時,指針?biāo)赶虻念愋蜎Q定了編譯
器將把那片內(nèi)存區(qū)里的內(nèi)容當(dāng)做什么來看待。
從語法上看,你只須把指針聲明語句中的指針名字和名字左邊的指針聲明符
*去掉,剩下的就是指針?biāo)赶虻念愋。例如?
(1)int *ptr; //指針?biāo)赶虻念愋褪莍nt
(2)CHAR *ptr; //指針?biāo)赶虻牡念愋褪?a target="_blank" href="http://m.58mhw.cn/stock-ic/CHAR.html">CHAR
(3)int **ptr; //指針?biāo)赶虻牡念愋褪?int *
(4)int (*ptr)[3]; //指針?biāo)赶虻牡念愋褪?int()[3]
(5)int *(*ptr)[4]; //指針?biāo)赶虻牡念愋褪?int *()[4]
在指針的算術(shù)運算中,指針?biāo)赶虻念愋陀泻艽蟮淖饔谩?
指針的類型(即指針本身的類型)和指針?biāo)赶虻念愋褪莾蓚概念。當(dāng)你對C越
來越熟悉時,你會發(fā)現(xiàn),把與指針攪和在一起的"類型"這個概念分成"指針的
類型"和"指針?biāo)赶虻念愋?quot;兩個概念,是精通指針的關(guān)鍵點之一。

1.3  指針的值,或者叫指針?biāo)赶虻膬?nèi)存區(qū)或地址。
   指針的值是指針本身存儲的數(shù)值,這個值將被編譯器當(dāng)作一個地址,而不是
一個一般的數(shù)值。在32位程序里,所有類型的指針的值都是一個32位整數(shù),因為
32位程序里內(nèi)存地址全都是32位長。
指針?biāo)赶虻膬?nèi)存區(qū)就是從指針的值所代表的那個內(nèi)存地址開始,長度為si
zeof(指針?biāo)赶虻念愋?的一片內(nèi)存區(qū)。以后,我們說一個指針的值是XX,就相
當(dāng)于說該指針指向了以XX為首地址的一片內(nèi)存區(qū)域;我們說一個指針指向了某塊
內(nèi)存區(qū)域,就相當(dāng)于說該指針的值是這塊內(nèi)存區(qū)域的首地址。
指針?biāo)赶虻膬?nèi)存區(qū)和指針?biāo)赶虻念愋褪莾蓚完全不同的概念。在例一中
,指針?biāo)赶虻念愋鸵呀?jīng)有了,但由于指針還未初始化,所以它所指向的內(nèi)存區(qū)
是不存在的,或者說是無意義的。
以后,每遇到一個指針,都應(yīng)該問問:這個指針的類型是什么?指針指向的
類型是什么?該指針指向了哪里?
1.4  指針本身所占據(jù)的內(nèi)存區(qū)。
指針本身占了多大的內(nèi)存?你只要用函數(shù)sizeof(指針的類型)測一下就知道
了。在32位平臺里,指針本身占據(jù)了4個字節(jié)的長度。
指針本身占據(jù)的內(nèi)存這個概念在判斷一個指針表達式是否是左值時很有用。(注釋:在picc18里,指針占用了兩個字節(jié))  

下面就picc18列舉個實例看下面程序

int  data[10]={1,2,4,5,6,7,8};
int  lenth1,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,可以這樣解釋:在lenth1=ptr2-ptr1;這條語句中兩個INT類型指針變量相減得一個(這在c中是允許的)非指針的數(shù),這個數(shù)的代表如下:
如果這兩個指針指向的內(nèi)型為INT型,那么這個數(shù)代表兩個指針之間相隔多少個INT型變量,顯然在以上程序中,data[0],和data[1]之間相隔了1個INT型變量
而在 lenth2=(int)ptr2-(int)ptr1;實際上是求data[1]和data[0]之間占用多少個內(nèi)存空間,注意(int)ptr是ptr的值(不是ptr所指向的數(shù)的值)
lenth3=*ptr2-*ptr1;相信稍微懂c的人都知道是在求ptr所指向的兩個值之間的差,和lenth3=data[1]-data[0]等效
大家不防試試lenth4=(CHAR*)ptr2-(CHAR*)ptr1;看看等于多少,

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

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

返回類型標(biāo)識符 *返回名稱(形式參數(shù)表)
{ 函數(shù)體 }
返回類型可以是任何基本類型和復(fù)合類型。返回指針的函數(shù)的用途十分廣泛。事實上,每一個函數(shù),即使它不帶有返回某種類型的指針,它本身都有一個入口地址,該地址相當(dāng)于一個指針。比如函數(shù)返回一個整型值,實際上也相當(dāng)于返回一個指針變量的值,不過這時的變量是函數(shù)本身而已,而整個函數(shù)相當(dāng)于一個“變量”。例如下面一個返回指針函數(shù)的例子:
CHAR   data[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)是指針變量,只不過該指針變量指向函數(shù)。這正如用指針變量可指向整型變量、字符型、數(shù)組一樣,這里是指向函數(shù)。如前所述,C在編譯時,每一個函數(shù)都有一個入口地址,該入口地址就是函數(shù)指針?biāo)赶虻牡刂。有了指向函?shù)的指針變量后,可用該指針變量調(diào)用函數(shù),就如同用指針變量可引用其他類型變量一樣,在這些概念上一致的。函數(shù)指針有兩個用途:調(diào)用函數(shù)和做函數(shù)的參數(shù)。函數(shù)指針的說明方法為:
數(shù)據(jù)類型標(biāo)志符 (*指針變量名)(參數(shù));注:函數(shù)括號中的參數(shù)可有可無,視情況而定。
下面的程序說明了函數(shù)指針調(diào)用函數(shù)的方法:
CHAR  max(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程序編寫中,函數(shù)指針不是很常用,如果大家有興趣看看UCOS的pic18的移植版本,就可以發(fā)現(xiàn)ucos中是用函數(shù)指針傳遞任務(wù)程序的入口地址的。


3:結(jié)構(gòu)聯(lián)合與指針
先看下面的一個簡單的舉例
typedef struct datas
{
  CHAR datah;
  CHAR datal;
  struct datas  *next;
} data;
//a是一個結(jié)構(gòu)變量
data  a,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是一個結(jié)構(gòu)型變量,ptr則是指向結(jié)構(gòu)型變量的指針,在c語言里,通過形如ptr->x的形式來訪問結(jié)構(gòu)或者指針的成員。
在結(jié)構(gòu)變量中定義了一個指針struct datas  *next; 這是在指針鏈中常用到的,ptr1->next=ptr2;  ptr2->next=0;實際上已經(jīng)建立了一條簡單的指針鏈,當(dāng)然建立指針鏈用這種初始化的方法不夠簡單,但是上面的程序只是為了說明指針和結(jié)構(gòu)而已。
在單片機的c語言程序中,聯(lián)合和結(jié)構(gòu)是經(jīng)常用在一起的下面在舉一個簡單的列子:
typedef struct
{
  CHAR datah;
  CHAR datal;
  
} data;
typedef  union
{

data   twpbyte;
int    bytes;

} piccdata;

piccdata  adres[10];
piccdata  *ptr1,*ptr2;
CHAR  lenth1,lenth2;
main()
{
ptr2=adres;
ptr1=adres;
ptr1++;
lenth1=ptr1-ptr2;
lenth2=(CHAR)ptr1-(CHAR)ptr2;


}
在以上程序中,lenth2為2,而lenth1為1,道理和第一個列子一樣,只是應(yīng)該注意的是在piccdata型變量中占用的空間為2個字節(jié)而不是4個字節(jié)。!
另:結(jié)構(gòu)與聯(lián)合是pic應(yīng)用的一個好東西,這點HOTpower曾經(jīng)有一很經(jīng)典的文章,在此列中,只要稍微加以改動,就可以對一個16位變量即可以整體訪問,也可分為高八位訪問和低八位訪問。這在ad轉(zhuǎn)換中是很有用的。

4:   const與指針
  const是一個C語言的關(guān)鍵字,它限定一個變量不允許被改變。   如果const關(guān)鍵字不涉及到指針,我們很好理解,下面是涉及到指針的情況:
int b = 500;
const int* a = &b;             [1]
int const *a = &b;            [2]
Int* const a = &b;          &nb
2樓: >>參與討論
fanguluke
多謝
 
3樓: >>參與討論
kaiser
好帖子^_^
 
4樓: >>參與討論
顧堅勇

 
5樓: >>參與討論
gxz207gxz
好。。。。。。
 
6樓: >>參與討論
冷若寒
thank you !!!!!!
thank you !!!!!!

參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
貝能的PICSTART PLUS能不能寫PIC10系列的單片機?
關(guān)于PIC16F676的帶隙電壓基準(zhǔn)問題!請教版主及高手們
PIC單片機哪里用得多?
我如何訪問指定地址的數(shù)據(jù)(含代碼),謝了!
如何識別齒輪的齒數(shù)并知道它是正轉(zhuǎn)還是反轉(zhuǎn)?
免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號