指针的本质就是一个能存地址的数据类型,其包含这个地址,同时含有一个步长信息 步长:就是加一或减一时移动的字节数.
用法: 定义 指针类型 *指针名; 赋值 指针名=地址; 操作 1.对指针的操作--根据类型确定字节数 1.向高位移动(+) :如:p+1(p不变),++p(p变化); 2.向低位移动(-) :如:p-1;--p; 2.对指针所指空间的操作 1.取值 如:*p 2.赋值 如:*p=值
应用场景: 1.指针与基本数据类型(int char double float) 应用举例: 定义:int *p; 赋值:int a=1; p=&a; 操作: 1.对指针的操作 *对数据本身无意义.(越界了) 2.对指针所指空间的操作 1.取值 int b=*p; 2.赋值 *p=3;
2.指针与构造数据类型中的用法(数组, 结构体) 数组 应用举例: int arr[3]={1,2,3}; 方法一:用首元素的指针(*推荐)指针运算方便. 定义赋值: int *p=arr;或者:int *p=&arr[0]; 操作: 1.对指针操作: 1.向高位移动(+): p+1(p不变),++p(p变化); 2.向低位移动(-): p-1,--p; 2.对指针所指空间的操作 1.取值: 取当前位的值: *p或p[0]; 取下一位的值: *(p+1);或p[1](等效于:arr[当前角标+1]); 取上一位的值: *(p-1);或p[-1](等效于:arr[当前角标+1]); 2.赋值: 给当前位赋值:*p=2,; 或p[0]=2; 给下一位赋值:*(p+1)=3;或p[1]=3; 给上一位赋值:*(p-1)=5;或p[-1]=5;
方法二:用整个数组的指针 定义赋值: int (*p)[3]=&arr; 操作: 1.对指针的操作--*对数组本身无意义 1.向高位移动(+): p+1,p++; 2.向低位移动(-): p-1,p--; 2.对指针所指空间的操作 1.取值: (*p)[角标],等效于arr[角标]; 或:*((*p)+1);等效于*(arr+1); (不推荐) 2.赋值: (*p)[角标]=2;
3.指针与指针类型
定义赋值: int a=0; int *p1=&a;int **p=&P1; 操作: 1.对指针的操作--*对指针本身无意义 1.向高位移动(+): p+1,p++; 2.向低位移动(-): p-1,p--; 2.对指针所指空间的操作 1.取值: 一级取值:*p;(取的是p1的值),二级取值:**p;(取的是a的值) 2.赋值: *p=&p1;**p=5;
4.指针与字符串 定义赋值: 字符串:char *p="heima";//注意与字符数组定义的区别:指针定义时是常量 字符串数组:char *ps[3]={"heima","itcast","itheima"};//注意是数组 操作: 1.对指针的操作 1.向高位移动(+): p+1,p++; 2.向低位移动(-): p-1,p--; 2.对指针所指空间的操作--跟数组使用基本类似 1.取值: 取当前位的值: *p或p[0]; 取下一位的值: *(p+1);或p[1](等效于:arr[当前角标+1]); 取上一位的值: *(p-1);或p[-1](等效于:arr[当前角标+1]); 2.赋值: !!!注意:常量不能赋值.(*这是说指针指向的空间,指针本身是可以赋值的); 如:char *p="itheima"; p[0]='m'//错误; 不能对指针所指空间的常量进行改变. p="itcast";//正确. 指针本身并不是常量.里面存的地址可以变化.
5.指针与函数 函数的指针定义: 类型 (*指针名)(参数类型); 如:int (*p)(int); 表示如下函数的指针类型: int add(int a){ return 0; } 赋值: 指针名=函数名; 如:p=add; 操作: 1.调用函数: 指针名(实参); 如:p(5);
|