标签:
继续学习指针..
下面来看指针的指针
顾名思义指针的指针就是指向指针所在地址的一个指针也叫作二级指针,废话不多说 我们来看代码定义方式及效果
#include <stdio.h> int main(){ int a=10; int* p=&a; int** s=&p; printf("%d\n",*p); printf("%d\n",**s); printf("------------\n"); printf("%p\n",p); printf("%p\n",*s); printf("------------\n"); printf("%p\n",s); }
相信朋友们已经知道二级指针的定义方式了,没错就是 类型 ** 变量名 比一级指针多个*而已,作为指针的指针也确实指向了一级指针的地址&p,
那么 有没有朋友细心观察输出的五个值呢? 前两个值是两个指针分别访问了&a地址内的数据,而第三第四个值则是变量a的地址,地址内储存着变量a的值也就是10,
大家不妨猜猜最后一个地址是什么?储存的又是什么?
最后一个地址是二级指针s的地址,储存的值则是一级指针p的地址
所以*s能访问到p的地址 而**s则能访问到p指向的地址中的值,也就是10;
事实上如果有需求可以有指针的指针的指针..也就是三级指针甚至四级指针,当然这个东西越多越容易乱,一般只用到二级指针什么时候用到二级指针呢? 当你在main函数调用一个函数 如果传入的是变量 那么在被调函数内无论对这个变量做什么修改都不会改变main函数也就是主函
数中变量的值..一级指针则能改变变量的值
#include <stdio.h> void change(int* a){ *a=30; } int main(){ int a=10; change(&a); printf("%d\n",a); }
二级指针呢?它不仅能改变一级指针或变量的值还能改变一级指针所指向的地址
#include <stdio.h> void change(int* a,int* b){ printf("%p\n",a); printf("%p\n",b); a=b; } int main(){ int a=10; int b=20; int *p=&a; change(p,&b); printf("%d\n",*p); }
运行结果输出10,可以看到函数中明明把a地址改成了b的地址 但main函数中p的地址并没有改变;
我们在用二级指针试试
#include <stdio.h> void change(int** a,int* b){ printf("%p\n",*a); printf("%p\n",b); *a=b; } int main(){ int a=10; int b=20; int *p=&a; change(&p,&b); printf("%d\n",*p); }
运行输出*p值为20,也就是说p指向的地址已经改变了
为了更明显看出地址的改变可在change()方法调用的前后输出
printf("%p\n",p);
二级指针就到这里了...接下来介绍一下常量指针,指向常量的指针,指向常量的常量指针
#include <stdio.h> int main(){ int a=10; int b=20; //int*const p=&a;//常量指针 //a=20; //p=&b;//X不允许更改所指地址 //*p=b;//√可以更改地址所在的值 //const int*p=&a;//指向常量的指针 //a=20; //p=&b;//√可以更改地址所在的值 //*p=b;//X不允许更改所指地址 //const int const*p=&a; //指向地址与地址中的值均不可以通过指针修改 //以上三种方式均可通过变量a修改值 printf("%d\n",a); printf("%d\n",*p); }
如果还有不懂得朋友可以评论留言问我
最后介绍一下函数指针
#include <stdio.h> int sum(int a,int b){ return a+b; } int main(){ int a=10; int b=20; int (*p)(int,int); //定义一个函数指针 p=∑ //给函数指针赋值函数地址 int result=(*p)(a,b); //调用函数指针,相当于通过函数指针调用sum函数 printf("%d\n",result); }
函数指针一般用于抽象化..比如说我要过滤一个数组 但是过滤方式并没有决定 这时候就可以设置一个函数指针作为抽象方法
#include <stdio.h> #include <stdbool.h> int*filter(int* start,int* end, bool (*test)(int a)){ int *b; while(start<end){ if(!(*test)(*start)){ b=start; while(b<end){ *b=*(b+1); b++; } end--; continue ; } start++; } return end; }
该方法调用时需要数组的首地址和尾地址,以及过滤方法 函数返回地址是过滤后数组的尾地址
标签:
原文地址:http://www.cnblogs.com/pengser/p/4915620.html