天天看点

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] 这个语法糖

继续阅读