C语言之指针再涉(二)
发布日期:2021-05-08 04:34:46 浏览次数:10 分类:精选文章

本文共 2918 字,大约阅读时间需要 9 分钟。

1  const指针

1.1  指向const的指针变量

实例1

#include
void main(void){ int const *p; const int*p2; //*p=2;是错误的(1)}

说明:const和数据类型名出现不分先后次序,*p始终相连

特点:该类指针指向的内存空间的内容(深层次的东西)是不可变的

:(1)报错原因---想通过赋值表达式改变了p指向的内存空间的内容,但声明中p指向的内容是不可变的

1.2  const型指针变量

实例2

#include
void 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

#include
void 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;}
编译结果

说明:max函数中的return语句必须返回一个变量的地址或一个指针变量的值

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;}
编译结果

说明:被赋值的函数变量(func)的类型必须与add的类型完全一致,包括返回值类型和每一个参数的类型;
即:函数型指针变量赋值时,左值与右值的类型必须完全一样
换句话说:不一样的地方就在(1)参数名可以省略,(2)函数名变成“(*函数名“)
两种调用方式均可原因:由于func被赋值为函数变量add的地址,而add的值又等于其地址,所以*func也可以得到add函数地址

2.4  void 型指针

回顾:关键字void
1---void作为函数的形参列表,表示该函数不需要参数
2---void用作函数的函数值类型,表示该函数没有返回值
3---void用作函数的指针类型
特点:可以指向任意存储数据类型的空间
定义形式:void*变量名;
待续。。。

上一篇:实现ContentProvider
下一篇:android创建数据库

发表评论

最新留言

不错!
[***.144.177.141]2025年04月10日 06时57分50秒