int *p;
p是变量的名字,int * 表示p变量存放int类型变量的地址
指针:
表示一些复杂的数据结构
快速的传递数据
使函数返回一个以上的值
能够直接访问硬件
能够方便的处理字符串
是理解面向对象语言中引用的基础
指针的定义:
地址
内存单元的编号 从0开始的非负整数 范围:0--4G-1
指针
指针就是地址,地址就是指针
指针变量就是存放内存单元编号的变量,或者说指针变量就是存放地址的变量
但是要注意:通常我们叙述时会把指针变量简称为指针,实际他们含义并不一样。
指针的本质就是一个操作受限的非负整数
指针的分类:
1.基本类型指针
int *p;//p是变量的名字,int * 表示p变量存放int类型变量的地址
int i = 3; int = j;
p = &i;
j = *p;
使用指针互换两个数
2.指针和数组的关系
指针和一维数组
一维数组名
一维数组名是个指针常量,一维数组名无法被改变,因为是常量
它存放的是一维数组第一个元素的地址,即a=&a[0]
二 数组和指针的关系:
①既然p是指向数组第一个元素起始地址的指针,可以用*(p+i)表示数组中第i+1个元素,a也是指向数组第一个元素的指针啊,那么能不能用*(a+i)表示第i+1个元素呢?
可以的,可以用printf 打印 *(a+i)的值验证
②反过来,a是指向数组第一个元素起始地址的指针,可以用a加数组下标引用数组元素,如a[3],p也是指向数组第一个元素起始地址的指针,能不能用p加数组下标引用数组元素?
也是可以的,可以用printf 打印 p[0], p[1]....的值验证
PS: 由上得,数组名a和指针p是一样的。实际上编译时,数组元素a[i] 就是当作 *(a+i)去处理的,先通过数组名a找到数组的首地址,然后首地址 a+i 得到元素a[i]的地址,
再然后通过*(a+i)得到第i个元素的内容。
所以:数组的第i个元素直接写成*(a+i)的形式直接取得值,效率不就提升了吗。省去编译器先通过数组名a找到数组的首地址,然后首地址 a+i 得到元素a[i]的地址,
再然后通过*(a+i)得到第i个元素的内容。
3.指针和函数的关系
4.指针和结构体的关系
5.多级指针
int i ;
int *p;p存放int类型的地址 p = &i; *p = i;
int **q;q存放int* 类型的地址 q = &p;*q = p; **q = i;
int ***r; r存放int **类型的地址; r = &q; *r = q; **r = p; ***r = i;