C++的基礎知識(十三)--指針變量

指針變量和指針所指向的內存空間是兩個不同的概念

  • 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指向的是堆區的內存空間,字符串從常量區拷貝到堆區

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章