C语言之指针再涉(二)

1  const指针

1.1  指向const的指针变量

实例1

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

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

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

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

1.2  const型指针变量

实例2

#include<stdio.h>
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<stdio.h>
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<stdio.h>
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<stdio.h>
 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<stdio.h>
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*变量名;
待续。。。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值