C语言指针的学习主要包括以下6个重点:
- 指针是什么
- 指针和指针类型
- 指针运算
- 指针和数组
- 二级指针
- 指针数组
下来就分条详细总结以上6个重点。
1.什么是指针
在计算机科学中,指针是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电 脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将 地址形象化的称为“指针”。
通俗来说就是我们在写程序中创建变量时向计算机内存申请了一块内存空间,当我们需要找到这块空间时,我们就需要通过一个地址来寻找,这个地址就称为指针。
2.指针和指针类型
变量有不同的类型,所以我们需要存放类型变量的地址时,就需要不同类型的指针变量。
char *pc = NULL;
int *pi = NULL;
short *ps = NULL;
long *pl = NULL;
float *pf = NULL;
double *pd = NULL;
char* 类型的指针是为了存放 char 类型变量的地址,int* 类型的指针是为了存放 int 类型变量的地址。
指针的类型决定了指针向前或向后走一步有多大距离,并且在指针解引用是,指针的类型决定了对指针解引用能有多大的权限
例如:char* 的指针解引用只能访问一个字节,而 int* 的指针解引用可以访问 4 个字节。
3.指针运算
指针可以 +或- 整数,也可以指针 - 指针。但是在绝大多数情况下,指针相加减是没有意义的。因为内存是计算机随机分配的,它是一个随机的值,所以没有意义。只有在一块连续的内存空间中,指针相加减才有意义。
指针 +或- 整数 代表指向当前的内存空间地址向前或向后跳过几个字节。
指针 - 指针 代表两个地址中间隔了几个字节。
4.指针和数组
其实指针和数组本来没有任何关系,因为它们是两个完全不同类型的东西。但是在C语言中,我们在传数组的时候,会把数组名隐式转化成一个指针,所以指针和数组才会有关系。
#include <stdio.h>
int main() {
int arr[10] = {1,2,3,4,5,6,7,8,9,0};
printf("%p\n", arr);
printf("%p\n", &arr[0]);
return 0;
}
这样我们就发现数组名表示的是数组首元素的地址。既然可以把数组名当成地址存放到一个指针中,我们就可以使用指针来访问一个数组。
我们的数组名 + 数字 就代表了访问这个数组中下标为对应数字的元素。
5.二级指针
我们知道指针也是一个变量,那么它也有地址,它的地址存在那里?这个问题就产生了二级指针。
int a = 10;
int* pa = &a;
int* *ppa = & pa;
在上面的代码中,a 的地址存放到了 pa 中,我们又把 pa 的地址存放到了 ppa 中。
我们通过对**ppa 的解引用找到了 pa , 在对* pa 的解引用找到了 a。
6.指针数组
指针数组是指针还是数组?
答案:是数组。这个数组中的元素是指针。
例:
int* arr[5];
它的意思是 arr 是一个数组,数组中的每一个元素是一个 int 类型的指针。