一、指標
在計算機語言中,由於通過位址能找到所需的變數,可以說位址指向該變數單元,因此把位址形象的稱為『指標』,意思是能通過它來找到以它為位址的記憶體單元。
1.1、指標&&變數
指標變數與普通變數一樣,使用之前不僅要定義說明而且必須要賦具體的值,未經賦值的指標變數不能使用;可以對指標變數初始化為null,但是不能對值為null的指標變數解引用。
如下定義乙個指標變數p指向a,這樣就可以通過p訪問a並對a進行操作。
int a=0;指標變數有很多態別,比如int *、char*、float*、void*等等。每種型別的指標可以訪問的記憶體大小不同,如果要訪問int型別資料只能使用int*型別指標,以此類推。int *p=null;
p=&a;
*p=10;
void*型別指標,不能對該型別指標進行演算法操作,如++和解引用,這是因為void*指向的記憶體的大小不確定。既然這樣,那麼void*型別指標到底有什麼用呢?
在某些時候,為了提高效率,我們需要乙個函式既可以處理int型別,又可以處理char型別,還可以處理其它型別資料,這個時候void*型別就非常有必要了。典型的如記憶體操作函式。
void * memcpy(void *dest, const void *src,
size_t
count);
#include #include void*my_memcpy(void*dest, void const*src, size_t count)上述**可以實現陣列的移動,移動大小以位元組來記。但是memcpy()不處理記憶體重疊的情況,如果想處理記憶體重疊應該使用memmove().return dest;
}int main()
; my_memcpy(arr + 3, arr, 16);
for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
printf("\n");
system("pause");
return 0;
}
上述內容使用的都是一級指標變數,其實還有二級、**等等指標變數。我們現來看一下二級指標變數,其它以此類推。
int a=10;指標變數ppa就是乙個二級指標變數。上述**形成的指向關係如下圖所示:int *pa=&a;
int *ppa=&pa;
變數pa儲存的是a的位址,變數ppa儲存的是pa的位址;我們可以通過*pa來訪問a,同樣我們可以通過*ppa來訪問pa,那麼我們就可以通過 **ppa訪問a。也就是說 **ppa就是a,我們可以通過它來操作a。
1.2、指標&&常量
乙個常量的位址沒有任何意義,我們要討論的是const修飾的指標。const修飾的指標變數時,這個指標變數便具有了常屬性。
1.2.1常量指標
int main()pa是乙個常量指標,const限制了通過這個指標修改變數的值,如果對pa進行 *pa=20;操作,這時編譯器會報錯,因為const修飾*pa
但是,這並不意味著a不可改,只是不能通過*pa來改而已。我們可以進行如下操作來修改a的值。
int *p=&a;*p=20;
1.2.2指標常量
int main()pb是乙個指標常量,指標常量的值是指標,這個值因為是常量,所以它不能被修改.此時pb是乙個指標常量,不能在指向其它的變數。如進行以下操作是非法的。
int _b=15;雖然pb不可改,並不是說pb指向的內容不可改,如*pb=30;這是可以的。pb=&_b;
const 修飾的區域性變數僅僅是語法上不可改,其實通過其它變數可以將pb的值改掉,乙個指向pb的二級指標,如:
int *ppb=&pb;*ppb=(int*)0x0018ff44;
但是,要注意的是const修飾的全域性變數,不管通過什麼方法都不可改。因為const修飾的全域性變數被存到了唯讀資料區。
1.2.3指向常量的指標常量
int main()pc是乙個指向常量的指標常量,pc是指標常量,指向的內容也是乙個常量,即pc不可改,*pc也不可改。 同樣這些並不意味著c的值不可改,只是不能通過*pc來改而已;pc不可改也僅僅是語法上的不可改,如想修改請參照1.2.2。
1.3、指標表示式與運算
不進行運算的指標變數是沒有太大的意義的,要使用指標變數進行運算就要知道指標運算的結果和表示式的值。如下所示:
char ch='a';char cp=&ch;
1.4、使用指標注意事項
本文出自 「牛麗」 部落格,請務必保留此出處
C grammar 斷言與表示式常量
3 宣告與定義 常量表示式是編譯期間就能計算其結果的表示式。const修飾的物件既可能是編譯期常量,也可能是執行期常量。constexpr說明符宣告可在編譯時計算函式或變數的值 constexpr intmax int a int b intmain const用來告知程式設計師const指向的內容...
正規表示式 常用表示式
羅馬數字 string p1 m d?c c dm l?x x lc v?i i vx string t1 vii match m1 regex.match t1,p1 交換前二個單詞 string t2 the quick brown fox string p2 s s s regex x2 ne...
c 常量和常量表示式
const,預設情況下僅在檔案內有效 const int i 12 const引用 對常量的引用不能被用作修改它所繫結的物件 const int ci 5 const int rci ci rci 90 錯誤 不能修改 允許常量引用繫結到非常量的物件 字面值或表示式上 int i 20 const ...