函数和数组
#include<iostream>
using namespace std;
const int Arsize=5;
int sum_arr(int arr[],int n);
int main(void){
int arr[Arsize]={1,2,4,8,16};
int sum=sum_arr(arr,Arsize);
cout<<sum;
return 0;
}
int sum_arr(int arr[],int n){
int total=0;
for (int i=0;i<Arsize;i++)
total+=arr[i];
return total;
}
int sum_arr(int arr[],int n);
其中 arr传入的是一个指针,而不是数组。
保护数组:
#include<iostream>
using namespace std;
const int Arsize=5;
void show_array(const double arr[],int limit);
int fill_array(double arr[],int limit);
int main(void){
double arr[Arsize];
int num;
num=fill_array(arr,Arsize);
cout<<num<<endl;
show_array(arr,num);
return 0;
}
int fill_array(double arr[],int limit){
double temp;
int i;
for (i=0;i<limit;i++){
cin>>temp;
if (!temp){
cin.clear();
while (cin.get()!='\n'){
continue;
}
break;
}
else if (temp<0){
break;
}
arr[i]=temp;
}
return i;
}
void show_array(const double arr[],int limit){
for (int i=0;i<limit;i++){
cout<<arr[i]<<' ';
}
}
void show_array(const double arr[],int limit);
该声明表明,指针arr指向的是常量数据,这意味着在show_array中不能使用arr来修改其数据。
使用数组区间作为参数
#include<iostream>
using namespace std;
const int Size=8;
int sum_arr(const int *begin,const int * end);
int main(void){
int arr[Size]={1,2,4,8,16,32,64,128};
int sum=sum_arr(arr,arr+Size);
cout<<sum<<endl;
return 0;
}
int sum_arr(const int *begin,const int * end){
const int *pt;
int total=0;
for (pt=begin;pt!=end;pt++)
total+=*pt;
return total;
}
指针和const
将const关键字用于指针:
1、指针指向一个常量对象
- 将const变量的地址给指向const的指针(可行)
- 将const变量的地址给指向常规的指针(不可行)
2、指针本身声明为常量
#include<iostream>
using namespace std;
int main(void){
int age=20;
const int *pt=&age;
cout<<pt<<endl;
cout<<*pt<<endl;
*pt+=1;
cout<<pt<<endl;
cout<<*pt<<endl;
return 0;
}
如果pt声明一个const类型,则不能通过使用pt来修改这个值,但可以通过修改pt所指向的变量的值来修改值
指针指向指针
一级间接关系:
#include<iostream>
using namespace std;
int main(void){
int age=20;
int *pd=&age;
const int *pt=pd;
cout<<pt<<endl;
cout<<*pt<<endl;
return 0;
}
二级间接关系:(与一级间接关系一样将const和非const混合的指针赋值方法将不再安全)
这里声明的const只能防止pt所指向的值,而不能防止修改pt的值
#include<iostream>
using namespace std;
const int Size=5;
int main(void){
int arr[Size]={1,2,4,8,16};
const int *pt=arr;
cout<<pt<<endl;
cout<<*pt<<endl;
pt=pt+1;
cout<<pt<<endl;
cout<<*pt<<endl;
*pt=*pt+1;
cout<<pt<<endl;
cout<<*pt<<endl;
return 0;
}
}
这里const可以使得无法修改指针的值
#include<iostream>
using namespace std;
int main(void){
int num=3;
const int *pt=#
int * const finger=#
return 0;
}
二维数组和指针:
#include<iostream>
using namespace std;
int sum(int (*arr)[4],int n);
int main(void){
int arr[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int sum_arr=sum(arr,3);
cout<<sum_arr<<endl;
return 0;
}
int sum(int (*arr)[4],int n){
int total=0;
for (int r=0;r<n;r++){
for (int c=0;c<4;c++){
total+=arr[r][c];
}
}
return total;
}
int sum(int (*arr)[4],int n);
这里采用int (*arr)[4]代表一个有4个int值组成的数组的指针
这里采用int *arr[4]代表一个有4个指向int的指针
函数和字符串
字符串函数原型应将其中表示字符串的参数声明为char*类型
#include<iostream>
using namespace std;
int all_char(const char *str,char ch);
int main(void){
char str[15]="hello world!";
int sum=all_char(str,'o');
cout<<sum<<endl;
return 0;
}
int all_char(const char *str,char ch){
int count=0;
while (*str){
if (*str==ch){
count++;
}
str++;
}
return count;
}
返回一个字符串
1、返回C++ -风格字符串的函数
#include<cstring>
#include<iostream>
using namespace std;
string copy(string str);
int main(void){
string str="hello world";
cout<<str<<endl;
cout<<copy(str)<<endl;
return 0;
}
string copy(string str){
return str;
}
2、返回C-风格字符串的函数
C-风格字符串无法通过函数直接返回,应该用函数返回一个指针
#include<iostream>
#include<cstring>
using namespace std;
const int Size=20;
char * copy(const char *str,int len);
int main(void){
char str[Size];
cin.getline(str,Size);
int length=strlen(str);
char *new_char;
new_char=copy(str,length);
cout<<new_char<<endl;
return 0;
}
char * copy(const char *str,int len){
char *new_char=new char[len+1];
new_char[len]='\0';
while (len-->0)
new_char[len]=str[len];
return new_char;
}
注意:当指针指向字符串时,存储字符串第一个字母的内存物理位置,输出是会输出整个字符串
#include<iostream>
#include<cstring>
using namespace std;
int main(void){
string str="hello world";
char *fp=&str[0];
cout<<fp;
return 0;
}