C++学习笔记2020.3.15(上)

函数和数组

#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=&num;
	int * const finger=&num;
	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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值