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; 只會改變指標變數值
含義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指向的是堆區的記憶體空間,字串從常量區拷貝到堆區