学习c语言这么久,使用指针时还是有这样或者那样的问题,且每次都有新的问题出现,只能感慨其博大精深。但指针作为c/c++的精华,我们也只能迎难而上。
0. 何为指针?
int* p;
如上述例子,我们可以这样理解:我们定义了一个指针变量p,它指向的数据的类型为int型。每当定义这样一个int*型的指针变量,系统(32位)会分配这一段大小为4Byte的内存,而p存储的就是内存的地址。
1.指针的初始化
int *a;
*a = 10;
我们来看一个错误的例子,那么它错在哪了呢?这个声明创建了一个名叫a的指针变量,然后将10放到a所指向的内存位置,但是在这里,我们声明了这个变量,但是并未对它进行初始化,所以a所指向的内存是未知的,于是就会出现错误。所以,我们使用指针时,须确保它已经被初始化。
2.指针的间接访问
我们可以通过两种方式访问指针,一是通过 * 操作符对指针进行解引用,我们可以把*当成一把钥匙,而指针所指向的内存里有许多房间,通过这把钥匙,我们便可以打开房间,找到里面的东西;但指针其实也有另一种方式进行访问。我们来看以下例子:
char *a = "abcdef";
printf("%c", a[4]);
我们看到这里指针是以数组下标访问的方式,其实a[4]等价于*(a+4),指针先找到首元素地址,对地址+4后的地址进行解引用。
3.指针数组和数组指针
什么是指针数组? 首先它是一个数组,数组的元素都是指针。同理我们知道,数组指针是一个指针,它指向一个数组。
int*p1[10];
int*(p2)[10];
显然前者的声明方式为指针数组,p1[10]表示元素为10的数组名为p1,在用int *对其修饰,表示p1里面存放了10个int 型的指针,所以称其为指针数组。后者为数组指针, * (p2)表示一个指针,指向了一个存放了10个int型数据的数组。
4.二级指针
如何理解二级指针,我们知道一级指针保存的是储存数据内存的地址,而二级指针则保存的是一级指针的地址;
int p[] = {0};
int *a1 = p;
int**a2;
上述例子中,二级指针a2指向的是一级指针的a1的地址,而一级指针a1指向的是数据p[]地址。