c語言指針(zhen)詳解(jie),學霸課堂(tang)記錄(lu)
時(shi)間:2018-08-22 來源(yuan):未知
指針
指針常(chang)量(liang):和地址(zhi)常(chang)量(liang)相同(tong) 指針變(bian)量(liang):用來存儲(chu)指針常(chang)量(liang)
指(zhi)(zhi)針(zhen):通常將指(zhi)(zhi)針(zhen)常量和(he)指(zhi)(zhi)針(zhen)變量統稱為指(zhi)(zhi)針(zhen)
以字節(jie)為單位將內存進行劃分,沒一(yi)(yi)個字節(jie)的空(kong)間都(dou)有一(yi)(yi)個地(di)址編號首地(di)址:某(mou)一(yi)(yi)段空(kong)間的 第一(yi)(yi)個地(di)址編號
指針永遠為4個(ge)字節指針的一般形(xing)式(shi):
數據類型 *指針變量名例如:int a = 10;
int *p =&a;
p:存儲a這段空間首地址的變量 &a:a這段空間的首地址取(qu)地址符:&
取值符號:*
取值(zhi)符號(hao)和取地址符互為逆運算初始(shi)化: int *p;
野指(zhi)(zhi)針(zhen):指(zhi)(zhi)針(zhen)隨機(ji)指(zhi)(zhi)向某一段空(kong)間(jian); 操(cao)作(zuo)野指(zhi)(zhi)針(zhen)可(ke)能(neng)會出(chu)現段錯(cuo)誤int *p=NULL;
空(kong)指(zhi)(zhi)針(zhen):指(zhi)(zhi)針(zhen)指(zhi)(zhi)向地址編號為0的那一段空(kong)間。 操作空(kong)指(zhi)(zhi)針(zhen)一定會出現段錯誤如何調試段錯誤
gdb調試工具
gcc -g 文件名.c gdb ./a.out
r(run)執行文件
q退(tui)出指針運算
p+1:會發生(sheng)指針(zhen)偏移,偏移的是所(suo)指向數據的數據類型p++ ++p p p
p>q:一般情況下運用(yong)在(zai)某(mou)一段連續的(de)空間
p-q:一般情況下(xia)也是運用在某(mou)一段連續的空間才有意義
查詢內存的保存形式(大端存儲或小端存儲) #include
int main(int argc ,congst char *argv[] )
{
int a = 0x12345678; int *p = &a;
printf("%#d\n",(char)*p); return 0;
}
輸出:0x78 說明計算機內存(cun)(cun)是小端存(cun)(cun)儲。
指針和數組的關系(xi)
int a[3] ={1,2,3}; 數組名:
a: 1、代表整(zheng)個數組
2、數(shu)組(zu)名(ming)是(shi)一個(ge)地址常量,是(shi)數(shu)組(zu)所在內存空間的首(shou)地址
一級數組內(nei)部關系:
int a[3]={1,2,3};
a = &a[0]; a+1=&a[0]+1=&a[1];
*(a+1)=*(&a[1])=a[1];
結論: *(a+n)= a[n];
一維數(shu)組和一級(ji)指針的關(guan)系int *p=a; p+1=a+1=&a[0]+1=&a[1];
*(p+1)=*(a+1)=*(&a[0]+1)=*(&a[1])=a[1];
*(p+1)=p[1];
結論:*(p+n)=*(a+n)=a[n]=p[n];
二維數組(zu)內部關(guan)系(xi)
int a[2][3]={{1,2,3},{4,5,6}};
a=&a[0]; a+1=&a[0]+1=&a[1];
*(a+1)=*(&a[0]+1)=*(&a[1])=a[1]
將a[1]看做一(yi)個一(yi)維(wei)數組(zu)的(de)數組(zu)名(ming)a[1] = &a[1][0]
a[1] + 1 = &a[1][0] + 1 = &a[1][1]
*(a[1] + 1) = *(&a[1][0] + 1) = *(&a[1][1])
*(a[1] + 1) = a[1][1]
*(*(a + 1) + 1) = a[1][1]
結論(lun): *(*(a + i) + j) = a[i][j]
二維數組(zu)和數組(zu)指針的關系
int a[2][3];
int (*p)[3]=a;
p + 1 = a + 1 = (&a[0] + 1) = &a[1]
*(p + 1) = *(a + 1) = *(&a[0] + 1) = *(&a[1]) = a[1] = p[1] p[1] + 1= a[1] + 1 = &a[1][0] + 1 = &a[1][1]
*(p[1] + 1) = *(a[1] + 1) = *(&a[1][0] + 1) = *(&a[1][1])
*(p[1] +1) = *(a[1] + 1) = a[1][1]
結論:*(*(p+i)+j)=*(*(a+i)+j)=a[i][j]=p[i][j]
#include
{
int a[5]={1,2,3,4,5};
int *ptr1=(int *)(&a+1); int *ptr2=(int *)((int)a+1);
printf("%x,%x",ptr1[-1],*ptr2); return 0;
}
輸(shu)出(chu)結果:5,2000000
字符指針
字符(fu)指針可以用來接(jie)受(shou)字符(fu)串(chuan),其實是接(jie)收字符(fu)串(chuan)的(de)首地址,但是不可以通過*的(de)方式(shi)去修改,否則(ze)會發生段錯誤(wu)。
指針習題
程序:

輸出:


