指针就是地址
变量 1.ID性。变量自己本身存在一个地址,唯一的ID
2.存储性。变量相当于一个容器,存储数字或者地址
变量访问通过变量名(数组遍历)或者是地址(地址偏移遍历数据)
指针变量 int *parr;
1.是一个变量,一个特殊的变量,区别在于存放的不是数字,而是一个地址,因此表明自己的特殊地位,在变量定义的时候加一个标识符*
2.最好是 int *parr 原因:在OS中一个地址是4个字节,虽然char *parr也可以同等条件存储一个地址,但是当进行对指针进行解引用操作时会存在差异。类型不同,访问的权限大小也不同。如一个地址;ox1234 (前16位0后16位以4个为一组,分别是1234) 在进行解引用操作时,int型可 全部访问,而char型只能访问的34(只能访问到一个字节八位) 导致地址部分缺失。
指针的好处:
1.在函数形参中的体现
传递数值,在函数1中交换两个数剧,
1.函数使用完毕后该内存自动释放
2.与main函数中未在同一块内存区域,即对数值形参进行的操作,无效,没有能力修改main函数所对应的内存
传递地址,在函数1中交换两个数据
看似是在函数1中进行操作,实际上他的权利很大,通过函数1中地址变量里的0x12(地址),直接在main函数中找到对应数据的内存区域,操作成功,可以修改数据内存。
2.指定到特定的区域C51中寄存器等
3.指针偏移+取内容 效率较高
指针的初始化
数组名 等价与 数组首元素的地址
访问数组数据 1.下标法遍历 2.指针偏移,取内容遍历
访问数组的时候:当在同一个函数中多次用指针访问同一个数组时,为了防止指针(地址跑到其他的地方)越界,需要在每次访问时将指针(地址)放到首元素即parr = arr;
地址(指针)与数组名可互换的地方如下: 1.parr[1] arr[1] 下标法 数组中第二个元素
2.parr………第一个元素的地址
parr+1 &arr[1] 第一个元素的地址
*( parr+i) arr[i] 第i个元素
地址(指针)与数字名不互换的时候:
指针常量………arr相当于&arr[0] 首元素的地址,是个常量 。编译不通过 常量指针………是个变量,通过偏移对应不同的地址
指针的自增自减
parr+数字 表示
1.地址+4/1(偏移几个字节由指针的类型决定)
2.+1表示访问到第一个元素的地址
经典代码
void InitArr(int *parr,int len);
{
for(int i=0;i<len;i++){
scanf(" %d ",*parr++);
}
}
void PrintArr(int *parr,int len)
{
for(int i=0;i<len;i++){
printf("%d",*parr);
parr++;
}
}
推荐题目:函数的封装用指针来实现 1.void InitArr(int *parr,int len);
2.void PrintArr(int *parr,int len);
3.数组倒置(i<len/2;j+i=len-1)