一、什么是指针
C语言里,变量存放在内存中,而内存以字节单位编制的,内存每个字节对应一个地址,CPU 通过内存寻址对存储在内存中的某个指定数据对象的地址进行定位。
二、声明指针
2.1 定义并初始化指针
指针变量的定义:
type * variable;
解析:
- * 表示该变量是指针变量
- type 表示该变量内存放的地址的寻址能力
int *p; // 声明一个 int 类型的指针 p
int *arr[10] // 声明一个指针数组,该数组有10个元素,其中每个元素都是一个指向 int 类型对象的指针
int (*arr)[10] // 声明一个数组指针,该指针指向一个 int 类型的一维数组
int **p; // 声明一个指针 p ,该指针指向一个 int 类型的指针
两种运算符,
- & :取地址运算符,获取变量的地址
- * :取内容运算符,获取存放在内存地址中的数据
声明一个指针变量并不会自动分配任何内存。在对指针进行间接访问之前,指针必须进行初始化:或是使它指向现有的内存,或者给它动态分配内存。初始化例子如下:
int *p;
int *p_var;
int num = 10;
p = #
p_var = p;
cout << &num << endl; //num变量的地址
cout << *p << endl; //指向变量的值
cout << p_var << endl; //num变量的地址
cout << *p_var << endl; //指向变量的值
运行结果如下:
2.2 未初始化和非法指针
一个指针变量,如果指向一个无效的空间,则该指针称为野指针,是由invalid pointer 翻译过来,直译是无效指针。常见情况有两种,一种是未初始化,另一种则指向已经被释放的空间。
对野指针的写入成功,造成的后果不可估计,比较难发现和调试。
NULL指针 ,俗称空指针,常用NULL给临时的指针进行初始化,或对已释放内存空间的指针赋值。
三、指针运算
3.1 赋值运算
3.2 算术符运算
3.3 关系运算
#include "stdio.h"
int main(){
int a[10] = {1,2,3,4,5,6,7,8,9,0};
int sub;
int *p1 = &a[2];
int *p2 = &a[8];
sub = p2-p1;
printf("%d\n",sub); // 输出结果为 6
return 0;
}
四、指针与数组
数组除了可以用下标法和本质法访问以外,还可以用指针法访问。能用数组名解决的问题的,都可以用指针来解决,而能用指针来解决的问题,并一定能用数组名来解决。
例如:用指针访问数组数据
int arr[]={1,2,4,8};
int *p = arr;
for(int i = 0 ;i<4;i++){
printf("arr[%d]=%d\n",i,*p++);
}
*p++:等价于*(p++)。其作用:先得到*p,再使 p=p+1。
指向数组元素的指针也可以表示成数组的形式,即允许指针变量带下标,如
*(p+i)可以表示成 p[i]。