指针(从一级指针到二级指针)
一、一级指针
1.指针是什么?
在计算机科学中,指针(Pointer)时编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。
简单来说,指针就是地址,指针变量就是代表地址的变量。
2.举例
//指针指向元素
int a=5;
int* p=&a; //这里的p就是一个一级指针,它指向的是a的地址。p里存放的就是a地址的内容。
int a = 10;
int* p = &a; // 指针类型一定要与指针所指向数据的类型相同
printf("%d\n", *p); // *p 就是解引用,原理是通过访问 p 里面存放的地址找到这个地址所指向的元素
printf输出的结果是: 10
//指针指向数组
int arr[10]={ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int* p=arr;
printf("%d\n",*p);
printf("%d\n", *(p + 1)); // 这里面 p +1 其实是 增加了 P 所指向数据类型大小字节的空间,p 开始是 1 的 地址, p +1: 因为 p 是int 型 指针,int 占 4个字节,所以要给 p 里面的地址加上 4,这样 p 的内容就变成给了 2 的地址;
printf输出的结果是:
1
2
二、二级指针
1.什么是二级指针?
A(即B的地址)是指向指针的指针,称为二级指针,用于存放二级指针的变量称为二级指针变量.根据B的不同情况,二级指针又分为指向指针变量的指针和指向数组的指针。
2.指向指针变量的指针
在如上的A指向B、B指向C的指向关系中,如果A、B、C都是变量,即C是普通变量,B是一级指针变量,其中存放着C的地址,A是二级指针变量,其中存放着B的地址,则这3个变量分别在内存中占据各自的存储单元,它们之间的相互关系下图所示,相互之间的前后位置关系并不重要.此时,B是一级指针变量,B的值(即C的地址)是一级指针数据;A是二级指针变量,A的值(即B的地址)是二级指针数据。
//指针指向指针变量
int a=10;
int* p=&a;
int** Q=&p; //Q就是一个二级指针,它指向的是p的地址。Q里面存放的就是p地址的内容。
printf("%d\n",**Q);
printf输出的结果是:10
3.指向数组的指针
在C语言中,数组与其它变量在使用上有很大的不同.无论是字符型、整型、实型变量,还是结构体类型或者指针类型的变量,语句中出现变量名都代表对该变量所在内存单元的访问,变量名代表整个变量在内存中的存储单元,可以向该变量赋值,也可以从中取出数据使用.但是定义一个数组之后,数组名并不代表整个数组所占据的内存单元,而是代表数组首元素的地址。
int arr[10]={ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int* p={arr,arr+1,arr+2,arr+3,arr+4};
int**Q=p;
printf("%d\n",**Q);
printf("%d\n",**(Q+1));
printf("%d\n",**(Q+2));
printf("%d\n",**(Q+3));
printf("%d\n",**(Q+4));
printf输出的结果是:
1
2
3
4
5