C语言指针用法总结
有人说指针是c语言最难的部分.可是,再难也得学,这可是c语言的精髓啊.其实当你真正学会了的时候感觉也就那样.别人所说的难主要是大学的从众心理,给自己的心理压力
提示:以下是本篇文章正文内容,下面案例可供参考
一、指针是什么?
所谓的指针,其实是用于存储地址的变量.
二、指针的定义
1.普通指针*p
1.定义
下面的三种写法是等价的:
int *p;
int * p;
int* p;
上面的定义表示的是:p是一个存储地址的指针,且该地址所装的变量是一个整型变量,不可以是其他类型的变量
float *p;
float * p;
float* p;
上面的定义表示的是:p是一个存储地址的指针,且该地址所装的变量是一个浮点型变量,不可以是其他类型的变量
2.用法*p,p,&p
int a;
int *p;
a=5;
*p=a;
//上面的两个变量的等号关系如下:
*p==a;
&(*p)==&a;
p==&a;
&p==一个地址(装该指针变量)
int a;
int *p=&a;
a=5;
//上面的两个变量的等号关系如下:
*p==a;
p==&a;
&(*p)==&a;
&p==一个地址(装该指针变量)
2.指针数组
1.定义
故名思义,指针数组就是用来装指针的数组.看这点必须先理解普通指针的用法.
int *a[3];//数组里的三个变量都是指针
int *b[2][3];//数组里的6个变量都是指针
2.用法
int *a[3];//数组里的三个变量都是指针
int *b[2][3];//数组里的6个变量都是指针
int c,d,e,f,g,h,i;
a[0]=&c;
a[1]=&d;
a[2]=&e;
int *p=&c;
//上面的变量的等号关系如下:
*a[0]==*(a[0])==c==*p;
p==a[0]==&c;
*a[1]==*(a[1])==d;
*a[2]==*(a[2])==e;
int *a[3];
int *b[2][3];
//上面的这两个定义也可以写成这样的等价形式
int *(a[3]);
int *(b[2][3]);
3.数组指针
1.定义
数组指针和指针数组是两个不同的概念,数组指针表示装数组的指针
int (*p)[3];//用来表示有3个元素的数组
int (*p1)[3][4];//用来表示含有3*4个元素的数组
2.用法
int (*p)[3];
int (*p1)[3][4];
int a[3];
int b[3][4];
p=&a;
//上面的变量的等号关系如下:
p==&a;
*p==a;
(*p)[0]==a[0];
(*p)[1]==a[1];
(*p)[2]==a[2];
int (*p)[3];
int (*p1)[3][4];
int a[3];
int b[3][4];
p=b;//没有&
//上面的变量的等号关系如下:
(*p)[0]==b[0][0];
(*p)[5]==b[1][2];
p[1][2]==b[1][2];
!!! 上面*p的括号绝对不能省,无论如何都要先给p初始化.int (*p)[3]=&a就相当于已经给p初始化了.
4.指针的数组表示
1.表示数组
首先,定义一个指针:
int *p;
int a[5];
p = a;
那么可以这样赋值:
*p=1;
*(p+1)=2;
*(p+2)=3;
...
也可以这样赋值:
p[0]=1;
p[1]=2;
p[2]=3;
...
2.表示变量
首先,定义一个指针:
int *p;
int a;
p = &a;
那么可以这样赋值:
*p=1;
*(p+1)=2;
*(p+2)=3;
...
也可以这样赋值:
p[0]=1;
p[1]=2;
p[2]=3;
...
还可以这样赋值
0[p]=1;
1[p]=2;
2[p]=3;
...
!!!指针变量一定要先初始化才能赋值,例如
int *p;
int a=1;
*p = a;
//上面的写法是错误的,因为指针变量还没初始化,p所指向的地址是无效的
int *p;
int a=1;
p=&a;
*p = a;
//上面的写法是正确的,指针p所指向的地址有效
5.多维指针
1.二维指针
定义:二维指针是指用来存储一级指针的地址
int *p;
int a=1;
p=&a;
//下面定义一个二维指针
int **q;
q=&p;
//上面的变量的等号关系如下
*p==a;
p==&a;
*q==p;
q==&p;
**q==a;
2.二维指针表示数组
定义:二维指针是指用来存储一级指针的地址
int *p;
int a=1;
p=&a;
int **q;
q=&p;
可以这样赋值
*(*q+0)=1;
*(*q+1)=2;
*(*q+3)=3;
...
也可以这样赋值
(*q)[0]=1;
(*q)[1]=2;
(*q)[2]=3;
...
还可以这样赋值
0[*q]=1;
1[*q]=2;
2[*q]=3;
...
3.三维指针
定义:三维指针是指装二级指针的指针
int a;
int *p;
int **q;
int ***r;
p=&a;
q=&p;
r=&q;
//上面的变量的等号关系如下
*p==a;
**q==a;
***r==a;
p==&a;
*q==&a==p;
**r==*q==p==&a;
总结
指针并不难学,主要是用法太多了.自己装个vs来多测试,才能达到最好的学习效果.上面的总结可能有不足或错误的地方,欢迎大家指正.向大家推荐c3程序员的的c语言基础课:C语言基础入门非常的适合小白.