C 指標 表示式 常量

2021-07-13 04:31:35 字數 2552 閱讀 3806

一、指標

在計算機語言中,由於通過位址能找到所需的變數,可以說位址指向該變數單元,因此把位址形象的稱為『指標』,意思是能通過它來找到以它為位址的記憶體單元。

1.1、指標&&變數

指標變數與普通變數一樣,使用之前不僅要定義說明而且必須要賦具體的值,未經賦值的指標變數不能使用;可以對指標變數初始化為null,但是不能對值為null的指標變數解引用。

如下定義乙個指標變數p指向a,這樣就可以通過p訪問a並對a進行操作。

int a=0;

int *p=null;

p=&a;

*p=10;

指標變數有很多態別,比如int *、char*、float*、void*等等。每種型別的指標可以訪問的記憶體大小不同,如果要訪問int型別資料只能使用int*型別指標,以此類推。

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)

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;

}

上述**可以實現陣列的移動,移動大小以位元組來記。但是memcpy()不處理記憶體重疊的情況,如果想處理記憶體重疊應該使用memmove().

上述內容使用的都是一級指標變數,其實還有二級、**等等指標變數。我們現來看一下二級指標變數,其它以此類推。

int a=10;

int *pa=&a;

int *ppa=&pa;

指標變數ppa就是乙個二級指標變數。上述**形成的指向關係如下圖所示:

變數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=&_b;

雖然pb不可改,並不是說pb指向的內容不可改,如*pb=30;這是可以的。

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 ...