1. 程式人生 > >C語言之指標專題一:指標變數和指標所指向的記憶體空間是兩個不同的概念

C語言之指標專題一:指標變數和指標所指向的記憶體空間是兩個不同的概念

指標變數指標所指向的記憶體空間是兩個不同的概念

char*p = "123456";//p是一個指標變數存放在臨時棧區,"123456"是一個字串常量存放在常量區,變數p儲存的是字串的地址

char*str = (char*)malloc(100);//將分配的100位元組的堆區的記憶體空間的地址賦值給指標變數p

strcpy(str,"123456");//將字串拷貝到堆區

1)指標也是一種變數,佔有記憶體空間,用來儲存記憶體地址

2)*p操作記憶體
   在指標宣告時,*號表示所宣告的變數為指標
   在指標使用時,*號表示 操作 指標所指向的記憶體空間中的值
   *p相當於通過地址(p變數的值)找到一塊記憶體;然後操作記憶體
   *p放在等號的左邊賦值(給記憶體賦值)
   *p放在等號的右邊取值(從記憶體獲取值)
3)指標變數和它指向的記憶體塊是兩個不同的概念
   含義1 給p賦值p=0x1111; 只會改變指標變數值

,不會改變所指的內容;p = p +1; //p++
   含義2 給*p賦值*p='a'; 不會改變指標變數的值,只會改變所指的記憶體塊的值 
   含義3 =左邊*p 表示 給記憶體賦值, =右邊*p 表示取值 含義不同切結!
   含義4 =左邊char *p
   含義5 保證所指的記憶體塊能修改
4)指標是一種資料型別,是指它指向的記憶體空間的資料型別
    含義1:指標步長(p++),根據所致記憶體空間的資料型別來確定
    p++=(unsigned char )p+sizeof(a);
    結論:指標的步長,根據所指記憶體空間型別來定。

5)一級指標易錯模型:

不斷修改指標變數的值,然後又回過頭來釋放該記憶體的時候,程式就會出bug

void main()

{

    char*p = (char*)malloc(100);

    strcpy(p,"123456789");

    p = p + 2;//指標指向已經改變

    *p = 'a' ;

    //注意:C語言規定:要釋放記憶體必須從記憶體首地址開始釋放

    free(p)//現在又想釋放原來所指向的空間,程式就會報錯

}

解決該錯誤的方法是加一個輔助指標變數pstr用來定位到首地址

void main ()
{
 char*pstr = NULL;
 char*p = NULL;
 p=pstr= (char*)malloc(100);
 strcpy(p, "123456789");
 p = p + 2;//指標指向已經改變
 *p= 'a';
 p = p - 2;
 printf("%s", p);
 free(pstr);//現在又想釋放原來所指向的空間,程式就會報錯
 p = pstr = NULL;//避免產生野指標
 system("pause");
}

6)一級指標記憶體模型建立

字串一級指標記憶體模型圖:

注意:

C語言字串在堆區、棧區,常量區都可以存放字串。

1、char buf[20] = "aaaa" 將常量區aaaa拷貝到棧區 

2、buf2[] = "bbbb"也是分配棧區空間和buf是一樣的

3、指標p1指向的是常量區的字串,儲存該字串的地址

4、指標p2指向的是堆區的記憶體空間,字串從常量區拷貝到堆區