指针是用来存放地址的,某类型的变量必须存放到该类型的指针之中。如整型的一个变量a,我们需要定义一个整型的指针去存放它的地址(int *p=&a)。记住,当我们定义了一个指针以后,一定要初始化并且赋给该指针一个值(即地址),否则,容易形成野指针,导致程序出现错误。定义指针变量时,在变量前加“*”,让系统知道你定义的是一个指针。
一般我们采用(int *p)这样的方式进行定义,当然也可以(int* p或者int * p)。定义指针之后,在使用指针时就不需要再加“*”,否则表示为指针所指向的内容。(如下)
int *p;
int a=10;
p=&a; //只能是把地址赋给指针,不能写成p=a或者p=10;
*p=10;
二级指针,是用来存放指针的位置,我们在使用的时候要注意“*”的使用。
int a=10;
int *p=&a;
int **p1=&p; //此时的p为指针,不用加“*”,要注意,定义二级指针时,指针名不能与一级指针重复,此行不能更改为int **p(p已经被定义为一 // 级指针)
简单的说,二级指针所指向的内容,就是它所指向的一级指针所指向的内容,所以如果printf("%d",**p1),结果为10;三级指针暂不考虑,与二级指针类似。
很多人都理解数组和指针的概念,但是一旦把指针与数组结合就绕晕了,其实只要记住,数组本身就是靠指针来实现的(它们的本质都是一样的),事实上,定义一个数组时,相当于定义了数组的地址,只不过,我们是以数组首元素的地址来替代数组地址的。注意:数组地址和数组首地址是两个概念
1 #include<stdio.h>
2 int main()
3 {
4 int i,a[6]={0,1,2,3,4,5};
5 int *p=a; //不用写&a,数组和指针本质一样
6 for(i=0;i<6;i++)
7 printf("%d\t",*(p+i)); //同理,这里可以写p[i]
8 }
同理,我们在scanf(“%d”,a[i])时,也可以写成scanf(“%d”,a+i)。
1 #include<stdio.h>
2 int main()
3 {
4 int i,j,a[2][3]={0,1,2,3,4,5};
5 int (*p)[3]=a; //数组指针
6
7
8 for(i=0;i<2;i++)
9 for(j=0;j<3;j++)
10 printf("%d\t",*(*(p+i)+j)); //a[i][j]相当于*(*(p+i)+j)也相当于*(*(a+i)+j)
11 }
注:&和*这两个过程是逆过程。一个取址,一个取值。