指針變量和指針所指向的內存空間是兩個不同的概念
- char*p = “123456”; //p是一個指針變量存放在臨時棧區,”123456”是一個字符串常量存放在常量區,變量p保存的是字符串的地址
- char*str = (char*)malloc(100); //將分配的100字節的堆區的內存空間的地址賦值給指針變量str
- 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");
}
C語言字符串在堆區、棧區,常量區都可以存放字符串。
1、char buf[20] = “aaaa” 將常量區aaaa拷貝到棧區
2、buf2[] = “bbbb”也是分配棧區空間和buf是一樣的
3、指針p1指向的是常量區的字符串,保存該字符串的地址
4、指針p2指向的是堆區的內存空間,字符串從常量區拷貝到堆區