c語言 int轉char 深入理解C語言的指標

2021-10-13 18:13:13 字數 1674 閱讀 7419

指標是c語言的乙個核心特色,它以一種統一方式對不同資料結構中的元素產生引用。對於新手來說,指標總是會帶來很多困惑,但其實指標的基本概念非常簡單。下面是一些指標和它們對映到機器**的關鍵原則。

指標型別表明指標指向的是哪一類物件。比如:

int *ip;

char **cpp;

變數ip是乙個指向int型別物件的指標,而cpp指標指向的物件自身就是乙個指向char型別物件的指標。

通常,如果物件型別是t,那麼指標的型別為t*。特殊的void *型別代表通用指標。比如malloc函式返回乙個通用指標,然後通過顯式強制型別轉換或賦值操作的隱式強制型別轉換,將它轉換成乙個有型別的指標。

指標型別不是機器**中的一部分,它是c語言提供的一種抽象,幫助程式設計師避免定址錯誤。

指標的值是某個指定型別的物件的位址。特殊的null(0)值表示該指標沒有指向任何地方。

「&」運算子可以應用到任何value類的c表示式上,value類指可以出現在賦值語句左邊的表示式,包括變數、結構和陣列的元素。

「*」運算子用於間接引用指標,其結果是乙個值,它的型別與該指標的型別一致。間接引用是用記憶體引用來實現的,要麼是儲存到乙個指定的位址,要麼是從指定的位址讀取。

乙個陣列的名字可以像乙個指標變數一樣引用(但不能修改)。陣列引用(a[3])與指標間接引用(*(a+3))有一樣的效果。

將指標從一種型別強制轉換成另一種型別,只改變它的型別,而不改變它的值。強制型別轉換的乙個效果是改變指標運算的伸縮。

比如p是乙個char *型別的指標,它的值為p,那麼(int *)(p+7)的結果為 p+7,而(int *)p+7的計算結果為p+28。

ps:強制型別轉換的優先順序高於加法。

這裡指標提供了乙個強大的儲存和向**傳遞引用的功能,這些引用可以被程式的其他部分呼叫。

比如有乙個函式定義如下:

int fun(int x, int*p);

然後可以宣告乙個指標fp,將它賦值給這個函式,

int (*fp)(int,int *);

fp = fun;

然後就可以用這個指標來呼叫這個函式:

int y = 1;

int result = fp(3, &y);

函式指標的值是該函式機器**表示中第一條指令的位址。

函式指標宣告的語法對新手程式設計師比較難以理解,對於以下宣告:

int (*f)(int*);

要從裡往外讀,即從(*f)開始,f是乙個指標,而(*f)(int *)表明f是乙個指向函式的指標,這個函式以乙個 int *作為引數。最後我們看到,它是指向以 int *為引數並返回int的函式的指標。

深入理解C語言 轉coolshell

首先,我們先來看下面這個經典的 1 3 5 intintprintf 2 4 6 8 10 12 14 16 f voidvoidintmain 你知道這段 會輸出什麼嗎?a 乙個隨機值,b 42。a 和 b都對 在 在函式外訪問區域性變數的乙個比喻 文中的最後給過這個例子 不過,你知道為什麼嗎?下...

深入理解C語言 深入理解指標

關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...

深入理解C語言 深入理解指標

關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...