C++知识点备忘录之函数、指针(五)
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=∑ //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初步(三)
下一篇: 函数