欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C++知识点备忘录之函数、指针(五)

程序员文章站 2022-03-13 22:45:26
...

1、参数为空

void say_hi():在C++中,括号为空与在括号中使用关键字void是等效的——意味着函数没有参数。

2、传递数组

为将数组类型和元素数量告诉数组处理函数,请通过两个不同的参数来传递他们:

        void fillArray(int arr[],int size);  //OK!

        void fillArray(int arr[size]);   //NO! 

     传递常规变量时,函数使用该变量的拷贝;传递数组时,函数使用该变量的地址。

    将数组地址作为参数可以节省复制整个数组所需的时间和内存。如果数组很大,则使用拷贝的系统开销将非常大,程序将需要更多的计算机内存,并花费时间来复制大量的数据。

#include <iostream>

using namespace std;
const int ArSize=8;
//int sum_arr(int arr[],int n);
int sum_arr(int *arr, int n);

int main(int argc, char *argv[])
{
    int cookies[ArSize]={1,2,4,8,16,21,64,128};

    cout<<"Address:"<<cookies<<endl;
    cout<<"sizeof cookies:"<<sizeof cookies<<endl;
    int sum=sum_arr(cookies,ArSize);

    cout<<"Total cookies eaten: "<<sum<<"\n";

    sum=sum_arr(cookies,3);
    cout<<"First three eters ate "<<sum<<" cookies.\n";
    sum=sum_arr(cookies+4,4);
    cout<<"Last four enters ate "<<sum<<" cookies.\n";
    return 0;
}


//int sum_arr(int arr[], int n)
int sum_arr(int * arr,int n)
{
    int total=0;
    for(int i=0;i<n;i++)
        total+=arr[i];
    return total;
}

以下两句话等价:

                int sum_arr(int arr[],int n);

                int sum_arr(int *arr, int n);

 

3、

当检测到输入有问题时,删除有问题的字符,并重复此操作,直至检测到有问题的位置之后的缓冲数据都被清空为止。

#include <iostream>
const int Max=5;
using namespace std;
int fill_array(double ar[],int limit);
void show_array(const double ar[],int n);
void revalue(double r,double ar[],int n);

int main()
{
    double properties[Max];

    int size=fill_array(properties,Max);
    show_array(properties,size);
    cout<<"Enter revaluation factor: ";
    double factor;
    cin>>factor;
    revalue(factor,properties,size);
    show_array(properties,size);
    cout<<"Done.\n";
    return 0;

}

int fill_array(double ar[], int limit)
{
    double temp;
    int i;
    for(i=0;i<limit;i++)
    {
        cout<<"Enter value #"<<i+1<<":";
        cin>>temp;

        if(!cin)
        {
            cin.clear();
            while(cin.get()!='\n')
                continue;
            cout<<"Bad input;input process terminated.\n";
            break;
        }
        else if(temp<0)
        {
            break;
        }
        ar[i]=temp;
    }
    return i;
}

void show_array(const double ar[], int n)
{
    for(int i=0;i<n;i++)
    {
        cout<<"Property #"<<i+1<<": $"
           <<ar[i]<<endl;
    }
}

void revalue(double r, double ar[], int n)
{
    for(int i=0;i<n;i++)
        ar[i]*=r;
}

 

4、指针和const

    1)让指针指向一个常量对象,可以防止使用该指针来修改所指向的值。

int age=20;
int sum=24;
const int * p=&age;  //ok
*p=10;  //not allowed
p=&sum;  //valid

    2)将指针本身声明为常量,可以防止改变指针所指向的位置。

int gorp=12;
int chips=114;
int * const p_snack=&gorp;
*p_snack=24;  //valid
p_snack=&chips; //invalid

 

    3)为什么不对类型为基本类型的函数参数使用const限定符呢?

            将const限定符用于指针,以防止指向的原始数据被修改。程序传递基本类型(如int或double)时,它将按值传递,以便函数使用副本。这样,原始数据将受到保护。

 

    4)按值传递参数和按地址传递参数的区别?

               如果glitz是一个结构变量,如何按值传递它?如何传递它的地址?这两种方法有何利弊?

                       a、要按值传递它,只要传递结构民glitz即可。要传递它的地址,要使用地址操作符&glitz。

                      b、按值传递将自动保护原始数据,但这是以时间和内存为代价的。按地址传递可节省时间和内存,但不能保护原始数据,除非对函数参数使用了const限定符。

                       c、另外,按值传递意味着可以使用常规的结构成员表示法(glitz.结构成员),但传递指针则必须使用间接成员操作符(glitz->结构成员)。       

        

5、作为函数的参数时,如果传递的参数是实参,则实际上是从原数据地址拷贝数据过来;使用指针时,实际只是传递原数据的地址,执行效率更高。

相关标签: 函数

上一篇: Java Swing初步(三)

下一篇: 函数