指針
就是"變量空間" 的首位址
位址:就是實體空間上位址的連續編号
指針變量:專門存儲位址常量的變量
定義
類型* 變量名;
注:指針變量配置設定4byte空間
運算符
&變量 //取變量的位址
*位址 //取位址所在空間的内容
指針的運算
指針 +/- 常量;
int *pa;
pa+n;//代表從指向位置向後移動n個元素機關的位址
指針 - 指針;//得到兩個元素位址區間的元素個數
一個指針的簡單實用例子
int a=100; //定義整型變量并初始化
int* pa=&a; //定義指針變量并初始化
printf("sizeof(pa)=%d &pa=%x &a=%x\n",sizeof(pa),&pa,&a);
//列印pa所占位元組數 pa的位址 a的位址
printf("pa=%x\n",pa); //列印pa的内容-----a的位址
printf("%d %d\n",a,*pa); //列印a 的兩種方法
結果圖:
一維指針存放的就是普通變量的位址
利用指針來交換兩數:
void swap(int *pa,int *pb) //定義交換函數
{
*pa=*pa^*pb; //交換a,b兩數,不可對位址進行操作,更不可直接傳入a,b來操作
*pb=*pa^*pb;
*pa=*pa^*pb;
}
int main()
{
int a=10,b=20;
printf("開始時:a=%d,b=%d\n",a,b); //列印開始時a,b的值
swap(&a,&b); //調用函數
printf("交換後:a=%d,b=%d\n",a,b); //列印交換後a,b的值
return 0;
}
結果圖:
指針與數組
數組:一塊連續的同類型空間
數組名:即為這塊空間的首位址
指針數組:可以存放多個指針的數組
即一個數組裡面存放的全是指針變量:
int a=10; //定義a
int *pa=&a; //定義a的指針
int b=20; //定義b
int *pb=&b; //定義b的指針
int c=30; //定義c
int *pc=&c; //定義c的指針
int *p[3]={pa,pb,pc}; //定義指針數組,存放pa,pb,pc
printf("%x %x %x\n",p[0],p[1],p[2]); //輸出指針數組的内容
printf("%d %d %d\n",*p[0],*p[1],*p[2]); //輸出指針數組内容的内容
結果:
數組的指針:指向數組的指針
這裡讨論二維數組與指針的關系:
int buf[3][4]={ {1,2,3,4},\
{11,12,13,14},\
{21,22,23,24}}; //定義一個二維數組
printf("%d %x\n",buf[0][0],&buf[0][0]); //探究二維數組行與列之間的關系
printf("%d %x\n",buf[1][0],&buf[1][0]); //輸出每行的首元素與其位址
printf("%d %x\n",buf[2][0],&buf[2][0]);
int arr[4]={1,2,3,4}; //定義一個以為數組
printf("%x %x\n",arr,arr+1); //一維數組的首位址與+1後的位址
printf("%x %x\n",buf,buf+1); //二維數組的首位址與+1後的位址
int (*p)[4]=buf; //定義二維數組的指針
//輸出二維數組的第二行第三列的數
printf("%d %d %d %d\n",*(*(p+1)+2),p[1][2],(*(p+1))[2],*(p[1]+2));
printf("%d %d %d %d\n",*(*(buf+1)+2),buf[1][2],(*(buf+1))[2],*(buf[1]+2));
結果:
對比結果我們可以發現:
- 以為數組+1指向下一列,二維數組+1指向下一行
- 通過輸出第二行第三列的數,我們可以發現二維數組與其指針用法一樣
-
通過2的結論我們可以得到一個文法糖(特别關鍵)
*(p+1) == p[1]
這個結論非常重要,在C語言指針的學習中一直都會遇見
小技巧:由于在記憶體空間中二維數組是以一維形式存在的,是以我們可以定義一個一維指針來輸出一個二維數組
int buf[][5]={ {1,2,3,4,5},\
{6,7,8,9,10},\
{11,12,13,14,15},\
{16,17,18,19,20}}; //定義二維數組
int *p=buf[0]; //定義一維指針指向二維數組第一行第一個元素的位址
int len=sizeof(buf)/sizeof(int),i; //求數組長度
for(i=0;i<len;i++)
printf("%d ",*(p+i)); //輸出
printf("\n");
結果:
一定要記住 *(p+1)=p[1] 這個文法糖