指针(三)(Week 6)
指针与函数
指针用做函数参数
- 虽然仍是值传递,但这里的值变成了“地址”,所以数据本身会发生变动
- 可否将数组名作为实参赋给指针型形参?
- 可以
- 可否将数组名当作形参来处理
- 可以,C++编译器会将形参数组名作为指针变量来处理
- 如何限制指针的功能
- const int array[]
- 指向符号常量的指针
- 符号常量:const 数据类型 常量名 = 常量值;
- 不能修改其指向区域的内容,但可以让他指向别的地方(只读的感觉)
指针用做函数返回值
-
函数的返回值可以是多种类型
- 返回整型数据的函数
- int max(int x, int y);
- 返回指针类型数据的函数
- int *****function(int x, int y);
- 注意:若返回局部变量的地址,会产生不可预料的结果
- 返回一个处于生命周期中的变量的地址,是安全的
- 返回全局变量的地址
- 返回静态局部变量的地址
- 返回整型数据的函数
-
静态局部变量
- 函数中的局部变量的值在函数调用结束后不消失而保留原值
- 即其占用的存储单元不释放,在下一次该函数调用时,仍可以继续使用该变量
- 用关键字static进行声明
- 静态变量的有效范围:变量定义开始,到整个程序结束
- 函数中的局部变量的值在函数调用结束后不消失而保留原值
总结
- 指针与函数
- 指针用做函数参数
- 函数拿到地址可对其所指内容进行修改
- 可以使用const来限制指针的功能
- 指针用做函数返回值
- 必须确保函数返回的地址是有意义的
- 返回全局变量或静态局部变量
- 指针用做函数参数
编程作业
Quiz1 分配病房
#include <iostream>
#include <iomanip>
using namespace std;
void outputer(int a, double b)
{
if(a<1000 && a>=100)
cout<<a<<' ';
else if(a<100 && a>=10)
cout<<"0"<<a<<' ';
else if(a<10 && a>=0)
cout<<"00"<<a<<' ';
cout<<fixed<<setprecision(1)<<b<<endl;
}
int main()
{
int num;
double stanard;
cin >> num >> stanard;
int numIll[50]={' '};
double numLevel[50]={' '};
for (int i = 0; i < num; i++) {
cin >> numIll[i] >> numLevel[i];
}
for (int i = 0; i < num-1; i++) {
for (int j = 0; j < num-i-1; j++) {
if(numLevel[j] < numLevel[j+1])
{
double temp1 = numLevel[j];
numLevel[j] = numLevel[j+1];
numLevel[j+1] = temp1;
int temp2 = numIll[j];
numIll[j] = numIll[j+1];
numIll[j+1] = temp2;
}
}
}
if(numLevel[0] < stanard)
{
cout<<"None."<<endl;
return 0;
}
for (int i = 0; i < num; i++)
{
if(numLevel[i] >= stanard)
outputer(numIll[i],numLevel[i]);
else
break;
}
return 0;
}
Quiz2 配对碱基链
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
char *all[n];
char after[1000][256] = {' '}; //组数要足够大
cin.get();
for (int i = 0; i < n; i++) {
char before[256] = {' '};
cin.getline(before,256,'
');
for (int j = 0; j < 255; j++) {
if(*(before + j) == 'A')
*(after[i] + j) = 'T';
else if(*(before + j) == 'T')
*(after[i] + j) = 'A';
else if(*(before + j) == 'G')
*(after[i] + j) = 'C';
else if(*(before + j) == 'C')
*(after[i] + j) = 'G';
else if(*(before + j) == ' ')
break;
}
*(all+i) = after[i];
}
for (int i = 0; i < n; i++) {
cout<<*(all+i)<<endl;
}
return 0;
}
Quiz3 寻找山顶
#include <iostream>
using namespace std;
int main()
{
int m,n;
int moun[20][20] = {' '};
int x[200],y[200];
int count = 0;
cin >> m >> n;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
cin >> moun[i][j];
}
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
int flag = 0;
if(j != 0)
{
if(moun[i][j-1] > moun[i][j])
flag = 1;
}
if(j != n-1)
{
if(moun[i][j+1] > moun[i][j])
flag = 1;
}
if(i != 0)
{
if(moun[i-1][j] > moun[i][j])
flag = 1;
}
if(i != m-1)
{
if(moun[i+1][j] > moun[i][j])
flag = 1;
}
if(flag == 0)
{
x[count] = i;
y[count] = j;
count++;
}
}
}
for (int i = 0; i < count; i++) {
cout<<x[i]<<' '<<y[i]<<endl;
}
return 0;
}