指针使用的基本格式:
定义:类型 *指针名 ,如:int *p;
赋值:
1.定义时同时赋值:
int a;
int *p = &a;
其中要注意的是,指针赋值时类型要相互匹配
如:
int a;
int *p = a;
指针只能存放地址,不能存放变量的值
又如:
char a;
int *p = &a;
不匹配类型的地址不可赋值,上面代码,指针是整型的,a是字符型的,所以不可赋值,在code::blocks中警告但是不会报错,然而得不到我们想要的结果。
再如:
int a[3][3];
int *p = a;
这行代码就很有意思了,我们知道数组名代表地址,但是在编译的时候我们却发现报错了,提示说类型不相容。但是运行一遍结果好像并没有什么问题。这是怎么回事呢,原来,二维数组的数组名如这里的a,代表着a[0]这个数组的地址(已经不是一个元素的地址了),而a[0]这个数组的地址恰好又 是以a[0][0]为代表的,所以在二维数组中a的值就和&a[0][0]一样,那么运算基本上没什么问题,但我们要知道这样写是存在问题的。
理解:
在定义之后就可以开心地使用指针了假设我们之前定义指针int *p;
那么,使用的时候该怎么用呢,我们结合数组来看。
# include <stdio.h>
int main()
{
int a[3]={1,2,3};
int *p = a;
p += 1;
printf("%d",*p);
return 0;
}
p 可以看作是一个储存地址的整型变量(注意:一定不要单纯的把p理解为p就是地址),在int *p = a;这行代码处,我们将a的地址存入p中,在p += 1;中,将p中地址的值+1,因为,数组中的地址的连续的,所以,p += 1;后,p中存的其实就是a[1]的地址,而a[1]中存的数值是2,所以printf("%d",*p);中由间接取地址符 * 从p中取出的值就是a[1]中存的值,也就是2。