C语言学习笔记第十章指针
2、指针变量量的赋值:&取地址
如:int *p;int i;p=&i;
float a,*p;p=&a;
说明:赋予指针变量量地址的变量量类型应与指针变量量基类型一一致。不不同类型地址字节不不同
3、指针变量量的定义初始化:如char c=‘F’,*t=&c;或者int a,*p=&a;
int a,*p;*p=a;这是错误用用法
表示形式 a[1]+2…*(a+1)+2…&a[1][2] *(a[1]+2)…*(*(a+1)+2)…a[1][2] a[0]…*(a+0)…*a a[1]…*(a+1) *a+1 含义 1行行行2列列元素a[1][2]的地址 1行行行2列列元素a[1][2]的值 0行行行0列列元素地址 1行行行0列列元素地址 0行行行1列列元素地址
4、空指针:int *p=NULL;或int *p=0;
说明:(1)指针变量量初始化时等号右边不不能是直接给出的具体地址,地址是0除外
(2)空指针无无具体的内存单元,不不能被引用用,也没有存地址(实际为了了后期使用用)
5、指针变量量的引用用:&取地址 *取内容
如:&a为a的地址,*p为指针变量量p指向存储单元的内容
{int i,s=0;for(i=0;i<n;i+=2)s+=b[i];return s;}
main(){int a[]={1,2,3,4,5},s;s=fun(a,5);printf(“%d”,s);}
输出结果:9
四、二二维数组与指针
1、二二维数组的地址:如int a[3][4],a是二二维数组名,即二二维数组的首首地址,第0行行行的地址
main()
{int a=3,b=5;fun(&a,&b);printf(“%d,%d\n”,a,b);
输出结果:3,5
三、指针变量量与一一维数组
1、数组元素指针的定义和定义初始化
(1)int a[10];int *p;p=&a[0];
(2)int a[10],*p;p=a;
(3)int a[10],*p=&a[0];
2、数组指针:int(*p)[4];…定义一一个指针变量量
如int a[3][4];int (*p)[4];p=a;
*(*(p+1)+2)等价于a[1][2]
六、函数指针与指针函数
1、函数指针:int(*p)();
说明:p是返回为整型函数的指针。
2、指针函数:int *p()
说明:p是返回值为整型地址的函数。
说明:*与自自增自自减运算符同级且自自右向左结合
3、用用数组名做函数参数
情况(1):数组元素作实参,形参是变量量……值传递
情况(2):数组元素地址作实参,形参是指针变量量……地址传递
情况(3):数组名作实参,形参是指针变量量……地址传递
例例题:int fun(int b[],int n)//相当于int fun(int *b,int n)
{*x+=*y;
*y+=*x;}
main()
{int a=3,b=5;fun(&a,&b);
printf(“%d,%d”,a,b);}
输出结果:8,13
说明:指针类型的形参接收实参的地址
例例题2:void fun(int *x,int *y)
{int t;t=*x;*x=*y;*y=t;}
(4)int a[10],*p=a;
即a为第0个元素a[0]的地址,a等价于&a[0],a是一一个地址常量量,通常习惯叫做数组首首元素地址
数组名就是首首元素地址
2、通过地址引用用数组元素
例例题1:int a[]={2,14,26,38,40},*p,*q;p=a;q=p+1;
printf(“%d,%d,%d,%d\n”,*p,*(p+2),*p+2,*q+4);
int m,s;p=&a[0][0];
m=(*p)*(*(p+2))*(*(p+4));
s=p[1]+p[3]+p[5];
m的值为15,s的值为12。
五、指针数组与数组指针
1、指针数组:一一组存放地址数据的数组,类型名 *数组名[数组⻓长度]。
如int *p[3];里里里边有p[0],p[1],p[2]三个内存单元可存int型指针
printf(“%d,%d”,p[3],q[3]);
输出结果:
2,26,4,18
38,40
(说明:[]即变址运算符,
例例题2:int a[]={5,10,15,20,25},*b=a;
printf(“%d ”,*p++);printf(“%d,%d”,*++p,++*p);
输出结果:5 15,16
例例题:int a[2][3]={1,2,3,4,5,6};
*(*(a+1)+2)=6
*(*a+1)=2
*(a[0]+2)=3
*(a[1]+1)=5
2、指向二二维数组的指针变量量:二二维数组在内存中先行行行后列列存储
0 0 1 1 4 1 2 5 2 3 6
例例题:int a[2][3]={1,2,3,4,5,6};int *p;
例例题1:int a=3,b,*p;p=&a;b=*p+2;
printf(“%d,%d\n”,a,b);
输出结果:3,5
例例题2:int a=3,b=5,c,*p,*q;p=&a;q=&b;
c=*p**q;printf(“%d”,c);
输出结果:15
6、指针变量量作为函数参数
例例题:void fun(int *x,int*y)……双向传递
main()
{int a=3,b=5;fun(&a,&b);printf(“%d,%d\n”,a,b);
输出结果:5,3
说明:交换算法最好使用用int t交换,若是*t则可能*t指向是重要内容
例例题3:void fun(int *x,int *y)
{int *t;t=x;x=y;y=t;}
一一、地址与指针
1、指针:一一个变量量的地址称为该变量量的指针
2、指针变量量:专⻔门存储地址的变量量
3、访问变量量的方方式:直接访问和间接访问
2000<—地址 a<—标识符 5 p 2000 5 *p a
2000
二二、指针变量量
1、指针变量量的定义:基类型 *指针变量量名;
如:float *pointer;char *p;int *q