1. 程式人生 > >C語言中指標的一些易錯點!

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

1、字元陣列與字串的使用

注意:陣列名是指向陣列首個元素的地址。

先看個例子:

#include <stdio.h>


int main()
{
    char *str = "hello";
    int len = strlen(str);
	int i;
	
	//直接輸出字串
    printf("%s\n", str);
   
   //使用*(str+i)
    for(i=0; i<len; i++)
	{
        printf("%c", *(str+i));
    }
    printf("\n");
  
    //使用str[i]
    for(i=0; i<len; i++)
	{
        printf("%c", str[i]);
    }
    printf("\n");
	
	return 0;
}

以上三個 printf 結果都是:hello。雖然結果相同,但性質卻有所差異。

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

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

2、指標陣列和二維陣列指標的區別

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

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


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

3、其他的一些注意點:

1) 指標變數可以進行加減運算,例如p++、p+i、p-=i。指標變數的加減運算並不是簡單的加上或減去一個整數,而是跟指標指向的資料型別有關。
 
2) 給指標變數賦值時,要將一份資料的地址賦給它,不能直接賦給一個整數,例如int *p = 1000;是沒有意義的,使用過程中一般會導致程式崩潰。
 
3) 使用指標變數之前一定要初始化,否則就不能確定指標指向哪裡,如果它指向的記憶體沒有使用許可權,程式就崩潰了。對於暫時沒有指向的指標,建議賦值NULL。
 
4) 兩個指標變數可以相減。如果兩個指標變數指向同一個陣列中的某個元素,那麼相減的結果就是兩個指標之間的元素個數。
 
5) 陣列也是有型別的,陣列名的本意是表示一組型別相同的資料。在定義陣列時,或者和 sizeof、& 運算子一起使用時陣列名才表示整個陣列,表示式中的陣列名會被轉換為一個指向陣列首地址的指標。