問(wèn)題:
1、int*p=NULL;
*p=100;
NULL是一個(gè)宏定義,定義如下:#defineNULL0
我這樣理解:第一句句的意思是定義指針變量p,p指向0x0000這個(gè)地址,第二句的意思為給0x0000這個(gè)地址賦值為100
2、假如我現(xiàn)在想讓p指向0x0010這個(gè)地址并賦值為100,為什么我這樣寫會(huì)出錯(cuò):
int *p=0x0010; *p=100;
但改成如下int *p=(int *)(0x0010);*p=100;這樣編譯后測(cè)試正確。
從道理上講,int *p=0x0010;應(yīng)該也是可以的把?為什么寫成NULL就可以,寫成0x0010就不行?!
網(wǎng)友評(píng)論:回19樓。加上* const p試試。C51 正確。
void main()
{
int data *constp=0x0010;
*p=100;
while(1);
}
有書上講。《C語(yǔ)言詳解》指針部分。
冷漠 發(fā)表于 2009-8-19 17:47
------------------------------------------------
經(jīng)過(guò)測(cè)試,編譯通不過(guò),測(cè)試的編譯器是PICC和IAR,都提示錯(cuò)誤。
網(wǎng)友評(píng)論:CONST只表示是一個(gè)不變化的常量,但沒(méi)有規(guī)定是否一定放在ROM區(qū),也可以放到RAM區(qū)的。
網(wǎng)友評(píng)論:
書上(關(guān)于ANSIC)講得很清楚了: --摘自《C語(yǔ)言詳解》P256指針初始化
......
指針對(duì)象一般不要初始化為除0之外的(注意包括除NULL之外的--冷漠注)其它整數(shù)值(直接量),例如,一般不要使用說(shuō)明:
int *pi=
10000; // 冷漠注:如若允許,那么 int *pi=10001; 也被允許?--不在整數(shù)邊界。
因?yàn)閺?0000號(hào)地址開(kāi)始的若干個(gè)字節(jié)中并不一定剛好就分配給一整數(shù)對(duì)象。但也有一些特殊情況除外,比如要存取某個(gè)存儲(chǔ)單元的內(nèi)容時(shí)。(冷漠注:存取某個(gè)(單個(gè))存儲(chǔ)單元....)
.............
為安全起見(jiàn),在說(shuō)明一個(gè)指針對(duì)象時(shí)最好將它初始化為一個(gè)確定的值。如果在說(shuō)明它時(shí)還不能確定它所指向的是哪個(gè)對(duì)象或函數(shù),那么可以把它初始化為NULL(即0)。例如:
longint *pli=NULL; // 終于找到出處了。--冷漠注。
在說(shuō)明全局指針變量(extern)和靜態(tài)指針對(duì)象(static)時(shí),若未帶初始化部分,則這些指針對(duì)象的值均被(編譯器)初始化為NULL。但對(duì)于局部指針對(duì)象,在說(shuō)明時(shí)若未帶初始化部分,則該指針對(duì)象的值是不確定的,即必須在說(shuō)明時(shí)顯式指明其初值,其后再具有確定的值。
一個(gè)指針的取值范圍應(yīng)為機(jī)器所有可用
內(nèi)存的地址,但并不是所有內(nèi)存地址都可以作為任一指針變量的值。(注意這里的概念。--冷漠)。指針對(duì)象的值 必須是屬于該指針變量指向?qū)ο蟮念愋偷哪硞(gè)對(duì)象的地址。例如:一個(gè)指向整數(shù)類型的指針值不得是分配給一個(gè)浮點(diǎn)類型對(duì)象的內(nèi)存單元的首地址。(所以LZ必須指明0x0010這個(gè)首地址屬于何種(存取)對(duì)象類型。--冷漠)。
因此,指針變量可取的值是隨著實(shí)現(xiàn)的不同、執(zhí)行的不同而有所不同。
每一種類型的指針變量都有一個(gè)特殊的值NULL。NULL是一個(gè)定義在頭文件stddef.h中的宏,用于定義一個(gè)空指針。空指針表示指針不指向任何位置(而不是LZ 理解的指向0地址。)NULL實(shí)際上是一個(gè)整數(shù)常量,其值為零(理解為空值)。NULL值是有別于指向具體對(duì)象的指針值的特殊值(空指針標(biāo)識(shí)符)。
——以上摘自《C語(yǔ)言詳解》
至此概念講的已經(jīng)很清楚了。若要說(shuō)明一個(gè)指針初值,先要有一個(gè)具體類型的對(duì)象(以指向)。例如:
inta; //對(duì)象說(shuō)明在先。
int*ptr=&a; //指針初始化在后。
但是如若在指針說(shuō)明時(shí)還沒(méi)有任何對(duì)象所指向,--像LZ那樣,那么可以初始為空值,即:
int*ptr=NULL; // 并非指向0地址。NULL是不能作為實(shí)際指針使用的空指針值。
如若希望像LZ那樣把RAM地址0x0010 說(shuō)明為指向int變量的指針,則可以在初始化之后,在程序中定義:
ptr=(int *)0x0010;
或者在說(shuō)明初值時(shí),指明(未來(lái)對(duì)象)地址類型:int *ptr =(int *)0x0010; // C51int data *ptr =0x0010;已經(jīng)足夠信息。
網(wǎng)友評(píng)論:嚴(yán)格按照規(guī)則的寫法:
#include <stddef.h>
void main()
{
int data *p=NULL;
p=(int data *)0x0010;
*p=100;
while(1);
}
應(yīng)該在所有編譯器下通過(guò)。
網(wǎng)友評(píng)論:好貼