code與const void*指針

關於指針:安全

當定義int *p時,它也會在內存中給指針變量p分配一個內存單元,假設這個單元在內存的編址爲0x1003;此時,0x1003中的值是不肯定的,(由於咱們沒有給指針賦值),當編譯器遇到了p=&a時,就會在0x1003單元中保存一個地址(變量a在內存中分配的地址)函數

空指針:不指向任何單元,仿真野指針。在stdio.h中被定義爲spa

#define NULL ((void *)0)
#define NUL ’\0
NULL 使 p 指向地址 0。大多數系統中都將 0 做爲不被使用的地址,因此吳用 p 也不會毀壞數據
但並不是老是如此,也有系統會使用地址 0,而將 NULL 定義爲其餘值,因此不要把 NULL 和 0 等同起來
由於PC上有NULL的定義因此能夠直接拿來使用,可是在單片機中,就沒有NULL了。並且也不能簡單將NULL自定義爲0,由於0地址處是有用的,那麼此時該怎麼辦呢?
空指針在概念上不一樣於未初始化的指針。空指針能夠確保不指向任何對象或函數; 而未初始化指針則可能指向任何地方。在函數調用時對全部的空指針進行類型轉換多是預防可變參數和無原型函數出問題的最安全的辦法
注意 NULL 和 NUL 的區別:NULL表示空指針,是一個宏定義,能夠在代碼中直接使用。而 NUL 表示字符 '\0',也就是字符串結束標誌,它是ASCII碼錶中的第 0 個字符。NUL 沒有在C語言中定義,僅僅是對 '\0' 的稱呼,不能在代碼中直接使用

野指針的2種狀況:指針

1 定義指針時沒有肯定的指向對象(沒賦值成NULL)code

2 指針p被free或者delete以後,沒有置爲NULL對象

 

code是KEIL C51的擴展關鍵字,被其修飾的變量放在ROM(硬件層面實現只讀),經常使用來存儲一個字庫等常量數據表;內存

const是ANSI C的關鍵字(使用範圍比keil廣),被其修飾的變量理論上能夠修改,但編譯器會識別並報錯。經常使用來修飾一個常量字符串或常量表。字符串

(void *)型通用指針(無確切類型):它能夠指向任何類型的變量,連續存儲區的存儲單元。任何類型的指針均可以經過顯示類型轉換變爲void*型指針(即做爲左值。爲了獲取其存儲的起始地址而不得到大小),即void*是一種特別的指針,表明任何存儲類型(不能判斷所指對象的存儲長度,因此不能引用和參與計算(不能直接進行取內容的操做.必須先轉成別的類型的指針才能夠把內容解釋出來);常作函數的參數和返回值:此時表示入口參數或返回值能夠是任何類型的指針)。指針有兩個屬性:指向變量/對象的地址長度
可是指針只存儲地址,長度則取決於指針的類型 。
編譯器根據指針的類型從指針指向的地址向後尋址。
原型

void * memcpy(void *dest, const void *src, size_t len);
void * memset ( void * buffer, int c, size_t num );
編譯器

所以:

1 在51單片機中定義字庫表要用到code(也能夠用const CODE這樣既說明存儲類型有說明讀寫特性),查表返回表中位置要 unsigned char code *,不要code要出錯由於一個是定位到IDATA中,一個在CODE中。

2 字符串或者字符型指針做爲參數和返回值:做爲參數時用const void*,返回值用void*

3 char *p= "hello word!",此時不能用P[2];

  char str[]="hello word!",此時能夠用P[2];

或者char str[]= "hello word!";char *p=str;此時能夠用P[2];

相關文章
相關標籤/搜索