天天看點

C語言——指針

指針

就是"變量空間" 的首位址
           

位址:就是實體空間上位址的連續編号

指針變量:專門存儲位址常量的變量

定義
類型* 變量名;
           

注:指針變量配置設定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 的兩種方法
           

結果圖:

C語言——指針

一維指針存放的就是普通變量的位址

利用指針來交換兩數:

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;
}
           

結果圖:

C語言——指針

指針與數組

數組:一塊連續的同類型空間

數組名:即為這塊空間的首位址

指針數組:可以存放多個指針的數組

即一個數組裡面存放的全是指針變量:

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]);	//輸出指針數組内容的内容
           

結果:

C語言——指針

數組的指針:指向數組的指針

這裡讨論二維數組與指針的關系:

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));
           

結果:

C語言——指針

對比結果我們可以發現:

  1. 以為數組+1指向下一列,二維數組+1指向下一行
  2. 通過輸出第二行第三列的數,我們可以發現二維數組與其指針用法一樣
  3. 通過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");
           

結果:

C語言——指針

一定要記住 *(p+1)=p[1] 這個文法糖

繼續閱讀