C語言中指標的一些易錯點!

2021-08-03 23:29:07 字數 1119 閱讀 8259

先看個例子:

#include int main()

{ char *str = "hello";

int len = strlen(str);

int i;

//直接輸出字串

printf("%s\n", str);

//使用*(str+i)

for(i=0; i

最根本的區別:記憶體中的儲存區域不一樣,字元陣列儲存在全域性資料區或棧區,第二種形式的字串儲存在常量區。全域性資料區和棧區的字串(也包括其他資料)有讀取和寫入的許可權,而常量區的字串(也包括其他資料)只有讀取許可權,沒有寫入許可權。

使用方法:在程式設計過程中如果只涉及到對字串的讀取,那麼字元陣列和字串常量都能夠滿足要求,如果有寫入(修改)操作,那麼只能使用字元陣列,不能使用字串常量。

指標陣列和二維陣列指標在定義時非常相似,只是括號的位置不同:

int *(p1[5]);  //指標陣列,可以去掉括號直接寫作 int *p1[5]。

int (*p2)[5];  //二維陣列指標,不能去掉括號。

指標陣列和二維陣列指標有著本質上的區別:指標陣列是乙個陣列,只是每個元素儲存的都是指標,以上面的 p1 為例,在32位環境下它占用 4×5 = 20 個位元組的記憶體。二維陣列指標是乙個指標,它指向乙個二維陣列,以上面的 p2 為例,它占用 4 個位元組的記憶體。

1) 指標變數可以進行加減運算,例如p++、p+i、p-=i。指標變數的加減運算並不是簡單的加上或減去乙個整數,而是跟指標指向的資料型別有關。

2) 給指標變數賦值時,要將乙份資料的位址賦給它,不能直接賦給乙個整數,例如int *p = 1000;是沒有意義的,使用過程中一般會導致程式崩潰。

3) 使用指標變數之前一定要初始化,否則就不能確定指標指向**,如果它指向的記憶體沒有使用許可權,程式就崩潰了。對於暫時沒有指向的指標,建議賦值null。

4) 兩個指標變數可以相減。如果兩個指標變數指向同乙個陣列中的某個元素,那麼相減的結果就是兩個指標之間的元素個數。

5) 陣列也是有型別的,陣列名的本意是表示一組型別相同的資料。在定義陣列時,或者和 sizeof、& 運算子一起使用時陣列名才表示整個陣列,表示式中的陣列名會被轉換為乙個指向陣列首位址的指標。

1006 1015一些易錯點

1010 計算分數的浮點數值 時間限制 1000 ms 記憶體限制 65536 kb 提交數 27986 通過數 16833 題目描述 兩個整數a和b分別作為分子和分母,既分數a b,求它的浮點數值 雙精度浮點數,保留小數點後9位 輸入 輸入僅一行,包括兩個整數a和b。輸出 輸出也僅一行,分數 a ...

php一些易錯點

1.在函式外宣告的引數為global,在函式內呼叫時,需加上global x 100 function test 2.型別為弱型別,不用強制宣告其型別 3.常量使用define函式宣告,在使用時不需要加上 符號 define pi 3.1416926 echo pi 4.不僅比較值還有型別 5.fo...

php的一些易錯點

1.單引號與雙引號的區別 一般用單引號或雙引號標識乙個字串。單引號串與雙引號串,在php中的處理是不同的。雙引號中的內容可以被解釋並被替換,單引號串中的內容則被作為普通字元處理。例如 注 單引號中輸出的內容是 所見即所得 的,無論有無變數,都被當做普通字元原樣輸出。說明 在定義簡單的字串時,使用單引...