天堂草原最受欢迎的角色,天堂动漫,天堂在线,色天堂下载,天堂中文在线资源,亚洲男人天堂

技術熱線: 4007-888-234
設計開發

專注差異化嵌入式產品解決方案 給智能產品定制注入靈魂給予生命

開發工具

提供開發工具、應用測試 完善的開發代碼案例庫分享

技術支持

從全面的產品導入到強大技術支援服務 全程貼心伴隨服務,創造無限潛能!

新品推廣

提供新的芯片及解決方案,提升客戶產品競爭力

新聞中心

提供最新的單片機資訊,行業消息以及公司新聞動態

PICC與指針

更新時間: 2019-03-23
閱讀量:1754

十年專注單片機方案開發的方案公司英銳恩,分享PICC與指針。英銳恩現提供服務產品涉及主控芯片:8位單片機、16位單片機、32位單片機及各類運算放大器等。

1:指針四要素(這部分主要從網上搜索到的,還不錯):指針的類型指針所指向的類型指針的值或者叫指針所指向的內存區指針本身所占據的內存區 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指針所指向的類型。 當你通過指針來訪問指針所指向的內存區時,指針所指向的類型決定了編譯 器將把那片內存區里的內容當做什么來看待。 從語法上看,你只須把指針聲明語句中的指針名字和名字左邊的指針聲明符 *去掉,剩下的就是指針所指向的類型。

例如: (1)int *ptr; //指針所指向的類型是int (2)char *ptr; //指針所指向的的類型是char (3)int **ptr; //指針所指向的的類型是 int * (4)int (*ptr)[3]; //指針所指向的的類型是 int()[3] (5)int *(*ptr)[4]; //指針所指向的的類型是 int *()[4] 在指針的算術運算中,指針所指向的類型有很大的作用。 指針的類型(即指針本身的類型)和指針所指向的類型是兩個概念。當你對C越 來越熟悉時,你會發現,把與指針攪和在一起的"類型"這個概念分成"指針的 類型"和"指針所指向的類型"兩個概念,是精通指針的關鍵點之一。 

1.3 指針的值,或者叫指針所指向的內存區或地址。 指針的值是指針本身存儲的數值,這個值將被編譯器當作一個地址,而不是 一個一般的數值。在32位程序里,所有類型的指針的值都是一個32位整數,因為 32位程序里內存地址全都是32位長。 指針所指向的內存區就是從指針的值所代表的那個內存地址開始,長度為si zeof(指針所指向的類型)的一片內存區。以后,我們說一個指針的值是XX,就相 當于說該指針指向了以XX為首地址的一片內存區域;我們說一個指針指向了某塊 內存區域,就相當于說該指針的值是這塊內存區域的首地址。 指針所指向的內存區和指針所指向的類型是兩個完全不同的概念。在例一中 ,指針所指向的類型已經有了,但由于指針還未初始化,所以它所指向的內存區 是不存在的,或者說是無意義的。 以后,每遇到一個指針,都應該問問:這個指針的類型是什么?指針指向的 類型是什么?該指針指向了哪里?

1.4 指針本身所占據的內存區。 指針本身占了多大的內存?你只要用函數sizeof(指針的類型)測一下就知道 了。在32位平臺里,指針本身占據了4個字節的長度。 指針本身占據的內存這個概念在判斷一個指針表達式是否是左值時很有用。(注釋:在picc18里,指針占用了兩個字節) 下面就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中是允許的)非指針的數,這個數的代表如下:如果這兩個指針指向的內型為INT型,那么這個數代表兩個指針之間相隔多少個INT型變量,顯然在以上程序中,data[0],和data[1]之間相隔了1個INT型變量而在 lenth2=(int)ptr2-(int)ptr1;實際上是求data[1]和data[0]之間占用多少個內存空間,注意(int)ptr是ptr的值(不是ptr所指向的數的值) lenth3=*ptr2-*ptr1;相信稍微懂c的人都知道是在求ptr所指向的兩個值之間的差,和lenth3=data[1]-data[0]等效大家不防試試lenth4=(char*)ptr2-(char*)ptr1;看看等于多少

2: 指針函數和函數指針有什么區別

 2.1,這兩個概念都是簡稱,指針函數是指帶指針的函數,即本質是一個函數。我們知道函數都又返回類型(如果不返回值,則為無值型),只不過指針函數返回類型是某一類型的指針。其定義格式如下所示: 返回類型標識符 *返回名稱(形式參數表) { 函數體 } 返回類型可以是任何基本類型和復合類型。返回指針的函數的用途十分廣泛。事實上,每一個函數,即使它不帶有返回某種類型的指針,它本身都有一個入口地址,該地址相當于一個指針。比如函數返回一個整型值,實際上也相當于返回一個指針變量的值,不過這時的變量是函數本身而已,而整個函數相當于一個“變量”。例如下面一個返回指針函數的例子: char data[10]; char* test(void); main() { char *ptr; ptr=test(); } char* test(void) { char *p; p=data; return p; } 注意:該程序在picc18中調試

 

2.2,“函數指針”是指向函數的指針變量,因而“函數指針”本身首先應是指針變量,只不過該指針變量指向函數。這正如用指針變量可指向整型變量、字符型、數組一樣,這里是指向函數。如前所述,C在編譯時,每一個函數都有一個入口地址,該入口地址就是函數指針所指向的地址。有了指向函數的指針變量后,可用該指針變量調用函數,就如同用指針變量可引用其他類型變量一樣,在這些概念上一致的。函數指針有兩個用途:調用函數和做函數的參數。函數指針的說明方法為: 數據類型標志符 (*指針變量名)(參數);注:函數括號中的參數可有可無,視情況而定。

下面的程序說明了函數指針調用函數的方法: 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中調試在pic的c程序編寫中,函數指針不是很常用,如果大家有興趣看看UCOS的pic18的移植版本,就可以發現ucos中是用函數指針傳遞任務程序的入口地址的。 3:結構聯合與指針先看下面的一個簡單的舉例 typedef struct datas { char datah; char datal; struct datas *next; } data; //a是一個結構變量 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; } 數據a,b是一個結構型變量,ptr則是指向結構型變量的指針,在c語言里,通過形如ptr->x的形式來訪問結構或者指針的成員。在結構變量中定義了一個指針struct datas *next; 這是在指針鏈中常用到的,ptr1->next=ptr2; ptr2->next=0;實際上已經建立了一條簡單的指針鏈,當然建立指針鏈用這種初始化的方法不夠簡單,但是上面的程序只是為了說明指針和結構而已。在單片機的c語言程序中,聯合和結構是經常用在一起的下面在舉一個簡單的列子: 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,道理和第一個列子一樣,只是應該注意的是在piccdata型變量中占用的空間為2個字節而不是4個字節!!!另:結構與聯合是pic應用的一個好東西,這點HOTpower曾經有一很經典的文章,在此列中,只要稍微加以改動,就可以對一個16位變量即可以整體訪問,也可分為高八位訪問和低八位訪問。這在ad轉換中是很有用的。

4: const與指針 const是一個C語言的關鍵字,它限定一個變量不允許被改變。 如果const關鍵字不涉及到指針,我們很好理解,下面是涉及到指針的情況: 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位于星號的左側,則const就是用來修飾指針所指向的變量,即指針指向為常量;如果const位于星號的右側,const就是修飾指針本身,即指針本身是常量。因此,[1]和[2]的情況相同,都是指針所指向的內容為常量(const放在變量聲明符的位置無關),這種情況下不允許對內容進行更改操作,如不能*a = 3 ;[3]為指針本身是常量,而指針所指向的內容不是常量,這種情況下不能對指針本身進行更改操作,如a++是錯誤的;[4]為指針本身和指向的內容均為常量。有了上面的基礎,對于在picc18中的c語言應用就可以開始了,在單片機編程中,經常會用到查表程序等,通常把大量的數據放入rom中,下面是一個簡單的列子 const int a[8]={1,2,3,-3,3,5,6,7}; const int *ptr; main() { ptr=a; ptr++; } 顯然ptr是一個指向常量的指針,ptr指向的數是不可變的,但是ptr本身是可變的,我們可以通過ptr來訪問定義在rom中的數組a[8];

联系我们: 尉犁县| 佛冈县| 高平市| 东兴市| 五原县| 申扎县| 高淳县| 习水县| 邢台市| 德江县| 班玛县| 阿克苏市| 麻城市| 阜城县| 沙田区| 桃园市| 莆田市| 息烽县| 磴口县| 都昌县| 临泽县| 万安县| 贵定县| 九龙县| 双城市| 金川县| 焦作市| 青铜峡市| 安图县| 太仓市| 图们市| 喀喇沁旗| 武邑县| 竹山县| 安顺市| 东乡县| 肥西县| 泽普县| 新绛县| 那坡县| 佛学|