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