指针
就是"变量空间" 的首地址
地址:就是物理空间上地址的连续编号
指针变量:专门存储地址常量的变量
定义
类型* 变量名;
注:指针变量分配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] 这个语法糖