首页 > 其他分享 >函数调用时用const保护指针

函数调用时用const保护指针

时间:2022-12-01 14:11:22浏览次数:40  
标签:const 指向 时用 void 函数调用 int wrong 指针

当调用函数并且把指向变量的指针作为参数传入时,通常会假设函数将修改变量(否则,为什么函数需要指针呢?)。例如,如果在程序中看到语句

f(&x);

大概是希望f改变x的值。但是,f仅需检查x的值而不是改变它的值也是可能的。指针可能高效的原因是:如果变量需要大量的存储空间,那么传递变量的值会浪费时间和空间。

可以使用单词const来表明函数不会改变指针参数所指向的对象。const应放置在形式参数的声明中,后面紧跟着形式参数的类型说明:

void f(const int *p)
{
    *p = 0; // wrong
}

这一用法表明p是指向“常整数”的指针。试图改变*p是编译器会检查的一种错误。

问: 声明void f(const int *p);是说函数f不能修改p吗?

答:不是。这说明不能改变指针p指向的整数对象,但是并不阻止f改变p自身。

void f(const int *p)
{
    int j;
    *p = 0;    // wrong
    p = &j;    // legal
}

因为实际参数是按值传递的,所以通过使指针指向其他地方的方法给p赋新值不会对函数外部产生任何影响。

#include <stdio.h>

void f(const int *p);

int main(void)
{
	int i = 6; 
	int j = 10;
	printf("i = %d, j = %d\n", i, j);
	f(&j);
	printf("i = %d, j = %d\n", i, j);
	return 0;
}

void f(const int *p)
{
	int j = 33;
	p = &j;
}

/* result
i = 6, j = 10
i = 6, j = 10
*/

问:声明指针类型的形式参数时,像下面这样在参数名前面放置单词const是否合法?

答:是合法的。然而效果不同于把const放在p的类型前面。在p的类型前面放置const可以保护p指向的对象。在p的类型后面放置const可以保护p本身:

void f(int * const p);
{
    int j;
    
    *p = 0;     // legal
    p = &j;     // wrong
}

这一特性并不经常用到。因为p很少是另一个指针(调用函数时的实际参数)的副本,所以极少有什么理由保护它。更罕见的一种情况是需要同时保护p和它所指向的对象,这可以通过在p的类型前和后都放置const来实现。

void f(const int * const p)
{
    int j;
    
    *p = 0;    // wrong
    p = &j;    //wrong
}

 

标签:const,指向,时用,void,函数调用,int,wrong,指针
From: https://www.cnblogs.com/matrioc/p/16941243.html

相关文章

  • <二>函数调用过程中对象优化
    代码1#include<iostream>usingnamespacestd;classTestV2{public: TestV2(inta=10):ma(a){cout<<"TestV2(int)"<<ma<<"对象地址="<<this<<endl;......
  • 类和对象之构造函数调用规则
    4.2.4构造函数调用规则默认情况下,C++编译至少给一个类添加3个函数默认构造函数(无参,函数体为文默认析构函数(无参,函数体为空)默认拷贝构造函数,对属性进行值传递构造函数调......
  • 关于@PostConstruct与@PreDestroy注解的使用详解
    一、@PostConstruct和@PreConstruct介绍从JavaEE5规范开始,Servlet增加了两个影响Servlet生命周期的注解(Annotation):@PostConstruct和@PreConstruct。这两个注解被用来修......
  • 对象原型 原型链 原型继承 constructor属性
    原型:   每个构造函数身上都有一个prototype原型  原型身上有一个对象   被称为原型对象(构造函数的this和原型上的this都指向实例化对象)<body>......
  • Android约束布局:ConstraintLayout学习文章记录
    (一)Android新特性介绍,ConstraintLayout完全解析(二)ConstraintLayout完全解析快来优化你的布局吧参考官方文档:​​https://developer.android.com/reference/android/suppor......
  • ConstraintLayout约束布局使用全解
    文章目录​​目的​​​​居中​​​​居中于⽗容器​​​​居中于控件中⼼​​​​⽔平⽅向居中​​​​垂直⽅向居中​​​​居中于控件的边​​​​填充​​​​权重​​......
  • const引用和指针
    1、可以为const引用初始化一个非const的对象、字面值,甚至是一般表达式。2、对引用初始化时必须严格进行类型匹配,但是const引用初始化时不需要类型匹配,只要可以转换为const......
  • 浅谈@PostConstruct注解
    目录​​前言:​​​​常见业务背景:​​前言:我们在Spring项目中经常会遇到@PostConstruct注解,可能有的伙伴对这个注解很陌生,出现场景如:首页介绍一下它的用途:@PostConstruct......
  • 为什么memcpy中要指定const void *
    voidcopyBytes(char*x,char*y,inthowMany)首先是你的指针char*,这意味着除了char*需要显式转换之外的任何指针类型.您应该使用void*,隐式转换指针类型.uint16_......
  • Xcode编译错误__NSCFConstantString
    __NSCFConstantString:主要错误就是数据类型造成的,然后就是检查哪个地方造成的数据类型调用错误错误一:'-[__NSCFConstantString_imageThatSuppressesAccessibilityHairlineT......