指標有型別,位址沒有型別
位址只是開始的位置,型別讀取到什麼位置結束(不同的型別讀取的位元組數不同)
空指標的預設值為0
1)什麼是空指標
如果 p 是乙個指標變數,則 p = 0;、p = 0l;、p = '\0';、p = 3 - 3;、p = 0 * 17; 、p = null; 中的任何一種賦值操作之後(對於 c 來說還可以是 p = (void*)0;), p 都成為乙個空指標
2) 如何判斷乙個指標是否是乙個空指標?
這可以通過與空指標常量或者其它的空指標的比較來實現(注意與空指標的內部表示無關)。例如,假設 p 是乙個指標變數,q 是乙個同型別的空指標,要檢查 p 是否是乙個空指標,可以採用下列任意形式之一——它們在實現的功能上都是等價的,所不同的只是風格的差別。
指標變數 p 是空指標的判斷:
if ( p == 0 )
if ( p == '\0' )
if ( p == 3 - 3 )
if ( p == null ) /* 使用 null 必須包含相應的標準庫的標頭檔案 */
if ( null == p )
if ( !p )
if ( p == q )
...
3) 空指標常量
0、0l、'\0'、3 - 3、0 * 17以及 (void*)0等都是空指標常量(注意 (char*) 0 不叫空指標常量,只是乙個空指標值)。至於系統選取哪種形式作為空指標常量使用,則是實現相關的。一般的 c 系統選擇 (void*)0 或者 0 的居多(也有個別的選擇 0l);至於 c++ 系統,由於存在嚴格的型別轉化的要求,void* 不能象 c 中那樣自由轉換為其它指標型別,所以通常選 0 作為空指標常量(tyc: c++標準推薦),而不選擇 (void*)0。
指標儲存的是變數的位址,如果儲存的這個變數是乙個指標變數,那麼這個指標就是多級指標.
指標的運算,一般在陣列遍歷時才有意義,基於陣列在記憶體中線性排列的方式
1) 指標運算
void main();
//陣列變數名:
ids就是陣列的首位址
,以下三種表示效果相同
printf("%#x\n",ids);
printf("%#x\n",&ids);
printf("%#x\n",&ids[0]);
//指標變數
int *p = ids;
printf("%d\n",*p);
//指標的加法
p++; //p++
向前移動
sizeof(
資料型別
)個位元組
printf("p的值:%#x\n", p);
//p--;
printf("%d\n", *p);
getchar();
2)通過指標給陣列賦值
void main(){
int uids[5];
//高階寫法
int i = 0;
for (; i < 5; i++){
uids[i] = i;
//早些版本的寫法
int* p = uids;
int i = 0; //i是陣列元素的值
for (; p < uids + 5; p++){
*p = i;
i++;
getchar();
函式指標
int msg(char* msg,char* title){
messagebox(0,msg,title,0);
return 0;
void main(){
//msg();
printf("%#x\n",msg);
printf("%#x\n",&msg);
//函式返回值型別,函式指標的名稱,函式的引數列表
int(*fun_p)(char* msg, char* title) = msg;
fun_p("訊息內容","標題");
getchar();
函式指標定義方式
:函式返回值型別,*函式指標的名稱,函式的引數列表 = 函式位址
int(*fun_p)(char* msg, char* title) = msg;
函式名即是函式的入口位址
所以msg
等同於&msg
應用場景
: 函式的引數列表是
函式指標
(函式的入口位址
)int add(int a,int b){
return a + b;
int minus(int a,int b){
return a - b;
void msg(int(*func_p)(int a, int b), int m, int n){
int r = func_p(m, n);
printf("執行結果:%d\n",r);
void main(){
//加法
msg(add, 10, 20);
//減法
//msg(minus,50,10);
getchar();
JNI入門之C C 基礎五
聯合體 共用體 不同型別的變數共同占用一段記憶體 相互覆蓋 聯合變數任何時刻只有乙個成員存在,節省記憶體 聯合體變數的大小 最大的成員所佔的位元組數 union myvalue int x int y double z void main union myvalue d1 d1.x 90 d1.y ...
Zookeeper入門(二)之基礎
在深入了解zookeeper的運作之前,讓我們來看看zookeeper的基本概念。本文主要包含如下內容 1 architecture 架構 2 hierarchical namespace 層次命名空間 3 session 會話 4 watches 監視 一 zookeeper的架構 架構圖如下 作...
C C 基礎 一 C 入門
先用c 來寫乙個helloworld的程式 include 預編譯指令 using namespace std 編譯指令 int main 函式頭 現在以第乙個c 程式引出一些最最最基本的概念。c 有兩種注釋形式 include語句是預處理指令。在c 中,使用乙個預處理器,該程式在進行主編譯之前,對...