\;\;\;\;\,
在c語言中,指標型別一般以資料類
型∗變數
名\color
資料型別∗變
量名的格式出現,如:
int *p;
\;\;\;\;\,
其實這並不有助於理解,而在c++中,指標型別允許如下寫法:
int* p;
\;\;\;\;\,
因此,我個人認為可以借助c++的格式來理解,指標從圖示上理解為指向某某某變數的指標,實際可以把指標當成一種新的變數型別,稱為指標型別,格式即為:變數類
型∗
\color
變數型別
∗
int* 變數名;
\;\;\;\;\;\;
本人作為初學者時遇到的第乙個應用就是利用函式交換兩個數的值:
void
exchangevalue
(int *leftnumber , int *rightnumber)
典型錯誤為:
void
wrongexchange
(int *leftnumber , int *rightnumber)
\;\;\;\;\;\;
上面這個函式對數的交換沒有任何作用,下面來解釋原因:
\;\;\;\;\;\;\;\;\;\;\;\;首先,我們忽略那套按值傳遞和按引用傳遞那些東西,個人認為c語言中指標引數也是按值傳遞,只不過指標引數傳遞的值是位址,因此第二個函式對位址的交換不會影響原實參儲存的位址,因此進行了一次無效交換。
對於指標形參能該改變實參指標指
向\color
指向的值的的原因在於∗
\color
∗這個運算子,也是指標作為雙刃劍的根源,能夠不受限制的直接對位址進行操作
\;\;\;\;\;\;
作為補充,大概講述一下按值傳遞,函式在實參轉化為形參的時候,不是真的將實參放到函式裡進行運算,而是在傳參時進行一次拷貝,宣告與函式生命週期相同的區域性變數(形參),然後將實參的值拷貝給形參。
\;\;\;\;\;\;
因此,對於指標變數,也沒什麼區別,只是指標變數拷貝的值,是指標變數中儲存的位址而已。
\;\;\;\;\;\;
作為補充,大概講述一下按值傳遞,函式在實參轉化為形陣列其實是一種特殊的指標,即陣列首位址,是常量指標,即這個指標儲存的值不可修改,這個不可修改並不是指數組的每乙個元素的值不可修改,而是陣列首位址儲存的 乙個連續的記憶體位址的開頭位址不可更改,也就是這個指標指向的位址不可修改。可能大家也有發現另外乙個證明指標與陣列是乙個型別的例子:
int a[10]
=;int *p = a;
// 以下這兩個迴圈輸出的值是相同的
for(int i =
0; i <10;
++i)
printf
("\n");
for(int i =
0; i <10;
++i)
\;\;\;\;\;\;
首先說明,c語言中沒有字串型別,而c語言中經常提及的字串其實是字元陣列的乙個特殊形式,例如:
//這個是字元陣列
char array[3]
=;//這個是字串
char string[4]
=;
\;\;\;\;\;\;
從上面的**可以看出,字串與字元陣列最大的區別就是結尾的字元:』 \0 『,這其實就是乙個標記值,由於更多的標頭檔案中的函式都是針對字串編寫的,因此我們對字元陣列並不是十分常見,對於各種字串函式使用,有很多部落格,不做贅述,也可以參考我的第一篇部落格,為c語言編寫了乙個字串的基礎操作。
\;\;\;\;\;\;
對於字串常量,在賦值的時候編譯器會自動補上』\0』
char array[10]
="goodbye"
;
\;\;\;\;\;\;
上面字元陣列中實際儲存的 goodbye\0,但是,計算字串長度時不要把\0算進去,前提是計算字串長度,其他花裡胡哨的長度不算。
c 指標簡述
1.在程式中定義了乙個變數,在對程式進行編譯時,系統就會給這個變數分配記憶體單元。編譯系統根據程式中定義的變數型別,分配一定長度的空間。一般整形變數分配4個位元組,字元型變數分配1個位元組。記憶體區的每乙個位元組有乙個編號,即 位址 2.由於通過位址能找到所需的變數單元,可以說,位址指向該變數單元。...
簡述 C 指標
看乙個一級指標例子 include int main 執行結果 foo.5 foo.0x7ffec682940c 取位址操作 foo p.0x7ffec682940c foo p 存 的值是foo的位址 foo p.0x7ffec6829410 取位址操作 foo p.5 引用操作符 foo p 獲...
函式指標簡述
1 函式指標的實質 a 函式指標的實質還是指標變數,不過指標指向的是函式。b 指標,函式指標,陣列指標都是指標。只不過指向的內容不同。都占用4個位元組。32位系統中都是4個位元組 c 函式指標就是乙個普通的指標變數。變數的型別是乙個函式指標變數型別。它的值是某個函式的位址。d 函式的實質是一段連續分...