
C语言之指针再涉(二)
实例4
发布日期:2021-05-08 04:34:46
浏览次数:10
分类:精选文章
本文共 2918 字,大约阅读时间需要 9 分钟。
1 const指针
1.1 指向const的指针变量
实例1
#includevoid main(void){ int const *p; const int*p2; //*p=2;是错误的(1)}
说明:const和数据类型名出现不分先后次序,*p始终相连
特点:该类指针指向的内存空间的内容(深层次的东西)是不可变的
注:(1)报错原因---想通过赋值表达式改变了p指向的内存空间的内容,但声明中p指向的内容是不可变的
1.2 const型指针变量
实例2
#includevoid main(void){ int *const p1;//---const指针变量的声明(最好设定初始值) int a=1; int b=2; int *const p=&a; *p=b;//(1) //p=&b;(2)}
说明:声明了一个int型的const指针变量
特点:该指针变量的值是不可改变的,即const型指针变量指向的内存空间是固定的(内存空间的内容可以变---(1)),初始化后不能指向其它空间
注:(1)试图改变const指针变量p的值,将p指向变量b的内存空间,但声明中const指针变量的值是不可改变的
1.3 指向const的const指针变量
实例3
#includevoid main(void){ const int* const p1; int a=1; int b=2; const int *const p=&a; //*p=520;(1) //p=&b; (2)}
说明:声明了一个指向存放const int型空间的const指针变量
特点:该指针变量的值和该指针指向的内存空间的内容都是不可改变的
注:(1)试图修改指针变量指向内存空间的内容,(2)试图改变指针变量的值
2 指针变量作为函数的形参和函数值
2.1 指针形参
实例4 #include int ceshi(int* p3); void main(void){int a=2; int *p1=&a;printf("普通变量变量a的地址:%p\n",&a); //变量a的地址printf("指针实参变量p1的值:%p\n",p1); //指针变量p1的值 printf("指针实参变量p1的地址:%p\n",&p1);//指针变量p1的地址 ceshi(p1);}int ceshi(int* p3){int *b=p3;//(1)printf("指针形参变量p3的地址:%p\n",&p3);//p3是不是等于&aprintf("指针形参变量p3的值:%p\n",p3); //不是传递传递的是一个变量的地址 printf("方法内普通变量b的地址:%p\n",b);//b的值是不是实参p1的值 return *b;//为什么假设返回的是int//说明:地址传递的是不是实参到的地址}}
编译结果
说明:函数调用时,将实参的值赋给形参;使用指针变量作为函数的形参,可以将一个内存空间的地址传递到函数中,可以通过通过地址来操作该地址上的内存空间,指针参数可以通过地址传递来间接改变外部的变量值
注意:地址传递并不是说传递实参的地址(&p1),而是指传递的是一个变量(a)的地址,这个地址仍是实参的值(p1),地址传递实际上还是值传递---从编译结果可以清晰看出 使用指针作为函数的形参需要的步骤: 1 定义一个含有指针变量形参的函数; 2 在主函数中为该变量分配空间,并将一个指针变量指向该空间 3 以这个指针变量为实参调用定义好的函数 4 在函数内改变该指针指向的值; 5 函数返回后,主调函数的变量已经改变2.2 指针型函数
声明:数据类型*函数名(形参列表)----形如:int* max(int a,int b,int c); 指针型函数:返回值的类型是指针类型, 强调的是指针(重心在前) 其中数据类型和指针操作符组成 指针类型实例5
#include编译结果int* max(int*a,int*b,int*c);//函数使用前必须先声明 main(void) { int d=0,e=0,f=0; int*p1=NULL; //空引用 printf("请输入三个数:"); scanf("%d,%d,%d",&d,&e,&f); p1=max(&d,&e,&f);//调用函数 printf("最大值:%d\n",*p1);} //三个数比较大小int* max(int*a,int*b,int*c){ int*p=NULL; if(*a>*b) p=a; else p=b; if(*p<*c) p=c; return p;}
2.3 函数型指针
概念:指向函数的指针,强调的是函数(指针作为修饰) 引入:C语言的函数也是放在代码区内,同样有地址,如何取到 函数的地址? 函数定义的时候实际上是定义了一个函数变量,是否可以将函数变量赋给其它的变量?实例6
#include编译结果int add(const int a,const int b);//函数使用必须先声明 main(void) { int(*func)(const int a,const int b);//函数指针的声明(声明了一个func函数,非定义一个函数指针),参数列表的参数名可以省略 func=add; //将其赋值为add printf("3+4=%d\n",func(3,4)); //调用方式1 printf("3+4=%d\n",(*func)(3,4)); //调用方式2 printf("%p\n",add); printf("%p\n",&add); printf("%p\n",func); printf("%p\n",*func);}int add(const int a,const int b){ return a+b;}
2.4 void 型指针
回顾:关键字void 1---void作为函数的形参列表,表示该函数不需要参数 2---void用作函数的函数值类型,表示该函数没有返回值 3---void用作函数的指针类型 特点:可以指向任意存储数据类型的空间 定义形式:void*变量名; 待续。。。发表评论
最新留言
不错!
[***.144.177.141]2025年04月10日 06时57分50秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
react路由使用以及封装
2021-05-08
vue计算属性和监听器区别
2021-05-08
前端常用知识随手记
2021-05-08
11.2.6 时间值的小数秒
2021-05-08
11.2.7 日期和时间类型之间的转换
2021-05-08
附录 B 错误信息和常见问题
2021-05-08
redis 内存溢出_从数据存储的角度告诉你Redis为什么这么快!
2021-05-08
实例分析Facebook激励视频广告接入
2021-05-08
实例:使用OKGO下载网络压缩包资源,然后解压缩放在本地使用
2021-05-08
Android主题和样式精炼详解
2021-05-08
HDFS Missing Block诊断信息的改进
2021-05-08
解决mybatis嵌套查询使用PageHelper分页不准确
2021-05-08
Redis源码分析(七)--- zipmap压缩图
2021-05-08
大规模集群自动化部署工具--Chef的安装部署
2021-05-08
一致性哈希算法
2021-05-08
HDFS源码分析(六)-----租约
2021-05-08
自定义Hive Sql Job分析工具
2021-05-08
聊聊HDFS RBF第二阶段的主要改进
2021-05-08
公司如何使用开源软件
2021-05-08
【MySQL】(九)触发器
2021-05-08