hi,你好!欢迎访问本站!登录
本站由网站地图腾讯云宝塔系统阿里云强势驱动
当前位置:首页 - 教程 - 杂谈 - 正文 君子好学,自强不息!

C和C++援用通报和数组传参援用

2019-11-18杂谈搜奇网41°c
A+ A-

援用通报有两种传参体式格局,详细可参考文章

概括地讲,就是

  • *声明一个形参是指针,所以须要通报指针实参,对应的函数完成也应该遵照指针的语法。这类完成思绪并不针对于C或许C++,由于它们都有指针,所以都能够经由过程指针来到达援用传参的效果,然则这类完成实质上不叫援用传参,由于通报的是指针,而不是实参的援用。

  • &这个操纵符,在形参声明时,示意该形参是一个援用,差别于指针也不是取地点操纵符,该援用操纵符属于C++的规范。函数被挪用时,不会在内存中拓荒新的空间,而是相当于给实参起了一个新名字,比方说以下代码中:

    void fun(int &a){
        a=2;
    }
    //挪用fun函数
    int num = 1;
    fun(num);

    在这个代码中,挪用fun函数时,没有给a形参拓荒内存空间,a实际上就是num变量的别号,a和num属于完整一样的存在。

参考链接:

https://stackoverflow.com/questions/57483/what-are-the-differences-between-a-pointer-variable-and-a-reference-variable-in

https://stackoverflow.com/questions/2229498/passing-by-reference-in-c

明白了指针传参和援用传参,再讲一下数组传参。

先思索一下,下面这段代码的输出

#include<iostream>
using namespace std;
//经由过程数组称号通报
void fun1(int arr[]);
//经由过程指针通报
void fun2(int *arr);
int main() {
    int arr[2] = {2,0};
    fun1(arr);
    for(int i=0; i<2; i++) {
        cout<<arr[i]<<endl;
    }
    
    cout<<endl<<endl;
    fun2(arr);
    for(int i=0; i<2; i++) {
        cout<<arr[i]<<endl;
    }

}

void fun1(int arr[]) {
    arr[0]=9;
    arr[1]=8;

}
void fun2(int *arr) {
    arr[0]=7;
    *(++arr)=6;
}

Output:

我们晓得数组的实质就是一连串雷同数据范例的数据,在内存中是一连寄存的,同时数组的称号,就是一个指针,它指向了第一个元素【下标为0】,所以,

fun1(int arr[])
fun2(int *arr)    

这两种体式格局完整一样,实质都是指针。既然如此,那末就须要明白对指针的操纵了。

//1.运用[]标记
/*
经由过程示例顺序,能够发明,直接经由过程'指针[i]'操纵,能够直接对响应的数组元素举行修正
*/
arr[0]=9;
arr[1]=8;


//2.对指针举行算数运算
/*
arr的值实际上是一个内存地点,统一平台下指针大小都雷同
比方PC x86上是4字节,x64上是8字节
然则,差别范例的指针步长差别,比方int范例的指针为4个字节,char范例指针步长为1个字节
所以下面这行代码,假如arr是int范例指针,假定它的值为000000000062FE10,那末++arr以后,它的值为000000000062FE14
假如arr是char范例指针,假定它的值为000000000062FE10,那末++arr以后,它的值为000000000062FE11
*/
++arr;

//3.指针解援用
/*
经由过程'*'对指针举行解援用操纵
*/

//4.掏出指针的地点'&'
/*
&是取址操纵符,然则彷佛对指针取址也没有什么意义吧
*/

联想到这里,再谈一个轻易失足的误区,先思索一下以下代码的输出:

//数组传参求数组长度
#include<stdio.h>
int sizeofarr(int arr[]) {
    printf("%d\n",sizeof(arr));
    printf("%d\n",sizeof(arr[0]));
    printf("%d\n",sizeof(int));

    return sizeof(arr)/sizeof(int);
}
int main() {
    int arr[10] = {2,0,9,3,2,1,2,5,6,7};
    printf("size of arr calculating by parameter: %d",sizeofarr(arr));
    
    printf("\n\n%d\n",sizeof(arr));
    printf("%d\n",sizeof(arr[0]));
    printf("%d\n",sizeof(int));
    
    printf("the actual size of arr: %d",sizeof(arr)/sizeof(arr[0]));
    return 0;
}

sizeof(arr)/sizeof(arr[0])这是一个非常经常使用的求数组长度的要领,条件是,不把arr通报到函数内里求长度,为何这么说呢?参考以下打印效果:

我的机子是64位的,所以sizeof(pointer)就是8,所以经由过程函数来求数组长度获得的效果就是2。

那末怎样防止这类毛病呢?

要么函数再加一个参数,示意数组的长度,要么定义一个全局的常量示意数组的长度。

参考链接:https://stackoverflow.com/a/10349610

  选择打赏方式
微信赞助

打赏

QQ钱包

打赏

支付宝赞助

打赏

  移步手机端
C和C++援用通报和数组传参援用

1、打开你手机的二维码扫描APP
2、扫描左则的二维码
3、点击扫描获得的网址
4、可以在手机端阅读此文章
未定义标签

本文来源:搜奇网

本文地址:https://www.sou7.cn/282325.html

关注我们:微信搜索“搜奇网”添加我为好友

版权声明: 本文仅代表作者个人观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。请记住本站网址https://www.sou7.cn/搜奇网。

发表评论

选填

必填

必填

选填

请拖动滑块解锁
>>