总结函数的参数,指针参数及const修饰的情况

 

void testn(int n)
{
 n = 0; //正确,但外部n值未变,小心逻辑错误
}

 

void testn(const int n)
{
 n = 0; //编译错误,加const可以防止逻辑错误
}

 

void testn(int* n)
{
 n = new int(3); //正确,但外部指针n值未变,小心逻辑错误
 *n = 0;   //正确,n指向变量的值被改变
}

 

void testn(int* const n)
{
 n = new int(3); //编译错误,n是常量指针,加const可以防止逻辑错误
 *n = 0;   //正确,n指向变量值被改变
}

 

void testn(const int*  n)
{
 n = new int(3); //正确,但外部指针n值未变,小心逻辑错误
 *n = 0;   //编译错误,加const可以防止指针指向的变量值被改变
}

 

void testn(int**  ppn)
{
 *ppn = new int[3];  //正确,ppn指向的指针值被改变
 **ppn = 6;    //正确,ppn指向的最终变量值被改变
 *ppn[0] = 7;   //正确,ppn指向的最终变量值被改变

 ppn = new int*[3];  //正确,但外部二级指针ppn值未变,小心逻辑错误
 ppn[0] = new int(5); //正确,但外部二级指针ppn值未变,小心逻辑错误
}

 

void testn(int**  const ppn)
{
 *ppn = new int[3];  //正确,二级指针ppn值被改变
 **ppn = 6;    //正确,ppn指向的最终变量值被改变
 *ppn[0] = 7;   //正确,ppn指向的最终变量值被改变

 //ppn[0] = new int(5); //正确,同*ppn
 //ppn = new int*[3]; //编译错误,ppn是常量二级指针加const可以防止逻辑错误
}

 

void testn( int* const*  ppn)
{
 //*ppn = new int[3]; //编译错误,ppn的值为常量指针,不能改变*ppn的值
 **ppn = 6;    //正确,二级指针指向的最终变量值被改变
 *ppn[0] = 7;   //正确,二级指针指向的最终变量值被改变

 ppn = new int*[3];  //正确,但外部二级指针ppn值未变,小心逻辑错误
 ppn[0] = new int(5); //编译错误,不能改变*ppn的值
}

 

void testn( int const**  ppn) //同testn(const int **  ppn)
{
 *ppn = new int[3];  //正确,二级指针ppn指向的指针值被改变
 //**ppn = 6;   //编译错误,不能改变**ppn的值
 //*ppn[0] = 7;   //编译错误,*ppn[0] = **ppn

 //ppn = new int*[3]; //编译错误,'int **' 到 'const int **' 转换错误 
}

 

//总结:函数参数为传值方式时,加const可以防止逻辑错误
//函数参数为传址方式时,加const可以防止参数数据被改变
//当参数为多级指针时,看const修饰对象可以看const与变量名之间的*
//当const与变量之间没有*时,修饰的就是多级指针本身
//当const与变量之间有一个*时,修饰的是多级指针的值
//如此推算直到修饰最后的变量值,所以const放在变量类型前后效果相同

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值