當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 學(xué)習(xí)筆記 > c語言指針詳解,學(xué)霸課堂記錄
指針
指針常量:和地址常量相同 指針變量:用來存儲(chǔ)指針常量
指針:通常將指針常量和指針變量統(tǒng)稱為指針
以字節(jié)為單位將內(nèi)存進(jìn)行劃分,沒一個(gè)字節(jié)的空間都有一個(gè)地址編號(hào)首地址:某一段空間的 第一個(gè)地址編號(hào)
指針永遠(yuǎn)為4個(gè)字節(jié)指針的一般形式:
數(shù)據(jù)類型 *指針變量名例如:int a = 10;
int *p =&a;
p:存儲(chǔ)a這段空間首地址的變量 &a:a這段空間的首地址取地址符:&
取值符號(hào):*
取值符號(hào)和取地址符互為逆運(yùn)算初始化: int *p;
野指針:指針隨機(jī)指向某一段空間; 操作野指針可能會(huì)出現(xiàn)段錯(cuò)誤int *p=NULL;
空指針:指針指向地址編號(hào)為0的那一段空間。 操作空指針一定會(huì)出現(xiàn)段錯(cuò)誤如何調(diào)試段錯(cuò)誤
gdb調(diào)試工具
gcc -g 文件名.c gdb ./a.out
r(run)執(zhí)行文件
q退出指針運(yùn)算
p+1:會(huì)發(fā)生指針偏移,偏移的是所指向數(shù)據(jù)的數(shù)據(jù)類型p++ ++p p p
p>q:一般情況下運(yùn)用在某一段連續(xù)的空間
p-q:一般情況下也是運(yùn)用在某一段連續(xù)的空間才有意義
查詢內(nèi)存的保存形式(大端存儲(chǔ)或小端存儲(chǔ)) #include
int main(int argc ,congst char *argv[] )
{
int a = 0x12345678; int *p = &a;
printf("%#d\n",(char)*p); return 0;
}
輸出:0x78 說明計(jì)算機(jī)內(nèi)存是小端存儲(chǔ)。
指針和數(shù)組的關(guān)系
int a[3] ={1,2,3}; 數(shù)組名:
a: 1、代表整個(gè)數(shù)組
2、數(shù)組名是一個(gè)地址常量,是數(shù)組所在內(nèi)存空間的首地址
一級(jí)數(shù)組內(nèi)部關(guān)系:
int a[3]={1,2,3};
a = &a[0]; a+1=&a[0]+1=&a[1];
*(a+1)=*(&a[1])=a[1];
結(jié)論: *(a+n)= a[n];
一維數(shù)組和一級(jí)指針的關(guān)系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];
結(jié)論:*(p+n)=*(a+n)=a[n]=p[n];
二維數(shù)組內(nèi)部關(guān)系
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]看做一個(gè)一維數(shù)組的數(shù)組名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]
結(jié)論: *(*(a + i) + j) = a[i][j]
二維數(shù)組和數(shù)組指針的關(guān)系
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]
結(jié)論:*(*(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;
}
輸出結(jié)果:5,2000000
字符指針
字符指針可以用來接受字符串,其實(shí)是接收字符串的首地址,但是不可以通過*的方式去修改,否則會(huì)發(fā)生段錯(cuò)誤。
指針習(xí)題
程序:
輸出: