Coursera课程笔记----C程序设计进阶----Week 6

指针(三)(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;
}
原文地址:https://www.cnblogs.com/maimai-d/p/12863674.html