Advertisement

常量指针与指针常量

阅读量:

常量指针与指针常量

常量指针

错误的理解

本质是一个指针,该指针指向的变量不能改变。

正确的理解

常量引用器:

  1. 其实质是作为一个指向器,在程序运行期间无法通过此引用器来修改其所指向对象的基本属性或成员函数。
  2. 被此引用器所指定的对象属性或成员函数仍然可以发生变化。
  3. 常量引用器可能指向其他不同的对象以供后续操作使用。
被指向的变量值可变(使用变量直接赋值的方式)
复制代码
    #include<stdio.h>
    int main(void)
    {
    	/*常量指针定义方式:
    	**比如一个int 类型的指针是这样定义的  int *p;
    	**那么int 类型的常量指针需这样定义:const int *p;或者int const *p;
    	*/
    	int a=4;
    	const int *p=&a;
    	printf("%d\n",a);
    	/*我们试图去改变a的值,看是否会报错误*/
    	a=6;
    	
    	printf("%d\n",a);					
    	return 0;		
    }
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解释

结果输出正常,未报任何错误;

在这里插入图片描述
通过常指针去改变被指向的变量值报错
复制代码
    #include<stdio.h>
    int main(void)
    {
    	/*常量指针定义方式:
    	**比如一个int 类型的指针是这样定义的  int *p;
    	**那么int 类型的常量指针需这样定义:const int *p;或者int const *p;
    	*/
    	int a=4;
    	const int *p=&a;
    	//p=&b;
    	//print("%d",*p);
    	printf("%d\n",a);
    	/*我们试图去改变a的值,看是否会报错误*/
    	//a=6;
    	*p=6;/*通过常量指针更改a的值,编译报错*/
    	
    	printf("%d\n",a);					
    	return 0;		
    }
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解释
在这里插入图片描述
更改常指针的指向
复制代码
    #include<stdio.h>
    int main(void)
    {
    	/*常量指针定义方式:
    	**比如一个int 类型的指针是这样定义的  int *p;
    	**那么int 类型的常量指针需这样定义:const int *p;或者int const *p;
    	*/
    	int a=4,b=5;
    	const int *p=&a;
    	printf("常指针*p指向a后 *p= %d\n",*p);
    	p=&b;
    	//printf("a=%d\n",a);
    	//printf("b=%d\n",b);
    	printf("常指针*p指向b后 *p= %d\n",*p);
    	/*我们试图去改变a的值,看是否会报错误*/
    	//a=6;
    	//*p=6;/*通过常量指针更改a的值,报错*/
    	
    	//printf("a=%d\n",a);					
    	return 0;		
    }
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解释
在这里插入图片描述

常量指针的用法思考

1、将函数的形参申明为常量指针,防止变量在函数调用的过程中发生改变。

复制代码
    #include<stdio.h>
    int Sum(const int *a,const int *b);
    int main(void)
    {
    	/*常量指针定义方式:
    	**比如一个int 类型的指针是这样定义的  int *p;
    	**那么int 类型的常量指针需这样定义:const int *p;或者int const *p;
    	*/
    	int a=4,b=5;
    	const int *p=&a;
    	printf("常指针*p指向a后 *p= %d\n",*p);
    	p=&b;
    	//printf("a=%d\n",a);
    	//printf("b=%d\n",b);
    	printf("常指针*p指向b后 *p= %d\n",*p);
    	/*我们试图去改变a的值,看是否会报错误*/
    	//a=6;
    	//*p=6;/*通过常量指针更改a的值,报错*/
    	
    	//printf("a=%d\n",a);		
    printf("a+b=%d\n",Sum(&a,&b));
    	return 0;		
    }
    int Sum(const int *a,const int *b)
    {
    	//*a=1;  /*此处对常量指针a指向的内容进行改变,会报编译错误*/
    	//*b=2;  /**/
    	return *a+*b;
    }
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解释

将形参改为非常量指针后,可正常编译执行

复制代码
    #include<stdio.h>
    int Sum(int *a,int *b);
    int main(void)
    {
    	/*常量指针定义方式:
    	**比如一个int 类型的指针是这样定义的  int *p;
    	**那么int 类型的常量指针需这样定义:const int *p;或者int const *p;
    	*/
    	int a=4,b=5;
    	const int *p=&a;
    	printf("常指针*p指向a后 *p= %d\n",*p);
    	p=&b;
    	
    	printf("常指针*p指向b后 *p= %d\n",*p);
    	/*我们试图去改变a的值,看是否会报错误*/
    	//a=6;
    	//*p=6;/*通过常量指针更改a的值,报错*/
    	
    	//printf("a=%d\n",a);		
    printf("a+b=%d\n",Sum(&a,&b));
    	printf("a=%d\n",a);
    	printf("b=%d\n",b);
    	return 0;		
    }
    int Sum(int *a, int *b)
    {
    	*a=1;
    	*b=2;
    	return *a+*b;
    }
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解释

不能将常指针转化为一般指针

复制代码
    #include<stdio.h>
    typedef struct
    {
    	int a;
    	int b;
    }Sum_DataType;
    
    int Sum(Sum_DataType *p);
    int main(void)
    {
    	/*常量指针定义方式:
    	**比如一个int 类型的指针是这样定义的  int *p;
    	**那么int 类型的常量指针需这样定义:const int *p;或者int const *p;
    	*/
    	int a=4,b=5;
    	const int *p=&a;
    	Sum_DataType m={10,4};
    	
    	Sum_DataType const *Sum_point=&m;
    	m.b=6;
    	//Sum_point->b=7;   /*编译报错*/
    	
    	
    	printf("m.b=%d\n",m.b);	
    	//printf("常指针*p指向a后 *p= %d\n",*p);
    	//p=&b;
    	
    	//printf("常指针*p指向b后 *p= %d\n",*p);
    	/*我们试图去改变a的值,看是否会报错误*/
    	//a=6;
    	//*p=6;/*通过常量指针更改a的值,报错*/
    	
    	//printf("a=%d\n",a);		
    printf("a+b=%d\n",Sum(Sum_point));
    	//printf("a=%d\n",a);
    	//printf("b=%d\n",b);
    	return 0;		
    }
    int Sum(Sum_DataType *p)
    {
    	p->a = 2;
    	p->b = 4;
    	return p->a+p->b;
    }
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解释
在这里插入图片描述

常指针作用范围为类型

复制代码
    #include<stdio.h>
    typedef struct
    {
    	int a;
    	int b;
    }Sum_DataType;
    
    int Sum(const Sum_DataType *p);
    int main(void)
    {
    	/*常量指针定义方式:
    	**比如一个int 类型的指针是这样定义的  int *p;
    	**那么int 类型的常量指针需这样定义:const int *p;或者int const *p;
    	*/
    	int a=4,b=5;
    	const int *p=&a;
    	Sum_DataType m={10,4};
    	
    	Sum_DataType const *Sum_point=&m;
    	m.b=6;
    	//Sum_point->b=7;   /*编译报错*/
    	
    	
    	printf("m.b=%d\n",m.b);	
    	//printf("常指针*p指向a后 *p= %d\n",*p);
    	//p=&b;
    	
    	//printf("常指针*p指向b后 *p= %d\n",*p);
    	/*我们试图去改变a的值,看是否会报错误*/
    	//a=6;
    	//*p=6;/*通过常量指针更改a的值,报错*/
    	
    	//printf("a=%d\n",a);		
    printf("a+b=%d\n",Sum(Sum_point));
    	//printf("a=%d\n",a);
    	//printf("b=%d\n",b);
    	return 0;		
    }
    int Sum(const Sum_DataType *p)
    {
    	//p->a = 2;/*编译报错*/
    	//p->b = 4;/*编译报错*/
    	return p->a+p->b;
    }
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解释

一般指针可以强制转化为常指针,编译不会报错

复制代码
    #include<stdio.h>
    typedef struct
    {
    	int a;
    	int b;
    }Sum_DataType;
    
    int Sum(const Sum_DataType *p);
    int main(void)
    {
    	/*常量指针定义方式:
    	**比如一个int 类型的指针是这样定义的  int *p;
    	**那么int 类型的常量指针需这样定义:const int *p;或者int const *p;
    	*/
    	int a=4,b=5;
    	const int *p=&a;
    	Sum_DataType m={10,4};
    	
    	Sum_DataType *Sum_point=&m;
    	m.b=6;
    	//Sum_point->b=7;   /*编译报错*/
    	
    	
    	printf("m.b=%d\n",m.b);	
    	//printf("常指针*p指向a后 *p= %d\n",*p);
    	//p=&b;
    	
    	//printf("常指针*p指向b后 *p= %d\n",*p);
    	/*我们试图去改变a的值,看是否会报错误*/
    	//a=6;
    	//*p=6;/*通过常量指针更改a的值,报错*/
    	
    	//printf("a=%d\n",a);		
    printf("a+b=%d\n",Sum(Sum_point));
    	//m->a=3;
    	//printf("a=%d\n",a);
    	//printf("b=%d\n",b);
    	return 0;		
    }
    int Sum(const Sum_DataType *p)
    {
    	//p->a = 2;/*编译报错*/
    	//p->b = 4;/*编译报错*/
    	return p->a+p->b;
    }
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解释
在这里插入图片描述

指针常量

本质是一个常量,只是常量的类型是指针,该指针一经赋值,就不能改变。

对指针常量进行赋值,编译报错

复制代码
    int main(void)
    {
    	/*指针常量定义方式:
    	**比如一个int 类型的指针是这样定义的  int *p;
    	**那么int 类型的常量指针需这样定义: int *const p;
    	*/
    	int a=4,b=5;
    	int *const p=&a;
    	p=&b;    /*对指针常量进行赋值*/
    	printf("a=\n",a);	
    	printf("b=\n",b);
    	
    	return 0;		
    }
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解释
在这里插入图片描述

全部评论 (0)

还没有任何评论哟~