Coursera課程筆記----C程序設計進階----Week 5

指針(二) (Week 5)

字符串與指針

  • 指向數組的指針
    • int a[10]; int *p; p = a;
  • 指向字符串的指針
    • 指向字符串的指針變量
    • char a[10]; char *p; p = a;
int main()
{
  int a = 5;
  int *pa = &a;
  
  int b[6] = {1,2,3,4,5,6};
  int *pb = b;
  
  char c[6] = {'h','e','l','l','o','\0'};
  char *pc = c;
  
  cout<<a<<endl; //5
  cout<<pa<<endl; //a的地址
  
  cout<<b<<endl;//b[0]的地址
  cout<<pb<<endl;//b[0]的地址
  
  cout<<c<<endl;//hello
  cout<<pc<<endl;//hello
  
  //若不想打印字符串內容,就想打印字符串地址
  cout<<static_cast<void*>(c)<<endl;
  cout<<static_case<void*>(pc)<<endl;
  
  return 0;
}
  • 字符串指針舉例
#include<iostream>
using namespace std;
int main()
{
  char buffer[10] = "ABC";
  char *pc;
  pc = "hello";//學習指針以前,咱們沒法直接賦值,只能在定義的時候這樣直接賦值
  cout<<pc<<endl; //hello
  pc++;
  cout<<pc<<endl;//ello
  cout<<*pc<<endl;//e
  pc = buffer;
  cout << pc;//ABC
  return 0;
}

指向二維數組的指針

再談一維數組的地址

#include<iostream>
using namespace std;
int main()
{
  int a[4] = {1,3,5,7};
  cout << a << endl; //a[0]的地址,a爲指向數組首元素的指針(基類型爲int)
  cout << a + 1 << endl;//a[1]的地址
  cout << &a << endl;//a[0]的地址,但至關於指向整個數組的指針(基類型爲int[4])
  cout << &a + 1 << endl;//a[3]以後的地址(越界了)
  cout << *(&a) << endl;//*E,E若爲指針,*E將返回E指向的內容,因此返回a[0]的地址,和打印a的結果相同
  cout << *(&a)+1 << endl;//a[1]的地址
  return 0;
}
  • 數組名至關於指向數組的第一個元素的指針
  • 若a是指向數組的第一個元素的指針,即a至關於&a[0]
    • &a是「指向數組」的指針, &a+1將跨越16個字節
    • &a至關於管轄範圍「上升」了一級
    • *a是數組的第一個元素a[0],即*a等價於a[0]
    • a至關於管轄範圍「降低」*了一級

指向二維數組的指針

  • 二維數組的定義
    • 二維數組a[3][4]包含3個元素:a[0],a[1],a[2]
      • 每一個元素都是一個「包含4個整形元素」的數組
    • 二維數組的第一個元素是a[0]
    • a[0]是一個「包含4個整型元素」的一維數組
      • a爲指向a[0]這個一維數組的指針
      • a[0]爲指向第一個元素a[0][0]的指針
      • 管轄範圍排序:&a>a>a[0]>a[0][0](連指針都不是,只是個量)
        • a = &a[0]
        • a[0] = &a[0][0]
        • a[0] = *a
        • a[0][0] = **a
    • 三條規律
      • 數組名至關於指向數組第一個元素的指針
      • &E至關於E⬆️
      • *E至關於E⬇️
int main()
{
  int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
  
  cout<<"   a ="<<a<<endl;
  cout<<"  &a[0] ="<<&a[0]<<endl<<endl;
  
  cout<<"   a+1 ="<<a+1<<endl;
  cout<<"  &a[0]+1 ="<<&a[0]+1<<endl<<endl;
  
  cout<<"   *a ="<<*a<<endl;
  cout<<"   a[0] ="<<a[0]<<endl;
  cout<<"  &a[0][0] ="<<&a[0][0]<<endl<<endl;
  
  cout<<"   *a+1 ="<<*a+1<<endl;
  cout<<"  a[0]+1 ="<<a[0]+1<<endl;
  cout<<" &a[0][0]+1 ="<<&a[0][0]+1<<endl<<endl;
  
  ...
  
  return 0;
}

編程做業

Quiz1 計算矩陣邊緣元素之和

#include <iostream>
using namespace std;
int main()
{
    int n = 0;
    cin >> n;
    for (int i = 0; i < n; i++) {
        int a,b;
        cin >> a >> b;
        int matrix[101][101];
        int summer = 0;
        for (int j = 0; j < a; j++) {
            for (int k = 0; k < b; k++) {
                cin >> matrix[j][k];
                if(j == 0 || j == a-1 || k == 0 || k == b-1)
                    summer += matrix[j][k];
            }
        }
        cout << summer << endl;
    }

    return 0;
}

Quiz2 二維數組右上左下遍歷

#include <iostream>
using namespace std;
int main()
{
    int row, col;
    cin >> row >> col;
    int shuzu[100][100];
    for (int j = 0; j < row; j++) {
        for (int o = 0; o < col; o++) {
            cin >> shuzu[j][o];
        }
    }//row 行 col 列
    int k = col + row - 1;//共有(行數+列數-1)條對角線
    for (int i = 0; i <= k; ++i) {//對每一條對角線進行處理
        cout<<"i = "<<i<<endl;
        int c = i - 1;//對角線行數列數起始點爲0,每次+1;因此,恰好起始點橫座標是對角線編號-1
        for (int r = 0; r < row; r++) //同理
        {
            if (r >= 0 && r < row && c < col && c >= 0) {//經過這個,找到在範圍內的。
                cout << *(*(shuzu + r) + c) << endl;//只打印在範圍內的
            }
            c--;//由於是由右邊到左邊,因此C--
        }

    }
    return 0;
}
//要想象到"畫面外的虛線"

Quiz3 文字排版

#include <string>
using namespace std;
int main()
{
    int n;
    cin >> n;
    string text;
    int flag = 80;
    for (int i = 0; i < n; i++) {
        string temp;
        cin >> temp;
        if(flag > temp.length())
        {
            text = text.append(temp);
            text = text.append(" ");
            flag -= (temp.length()+1);
        } else if (flag == temp.length()){
            text = text.append(temp);
            text = text.append("\n");
            flag = 80;
        } else{
            text = text.append("\n");
            flag = 80;
            text = text.append(temp);
            text = text.append(" ");
            flag -= (temp.length()+1);
        }
    }

    cout<<text<<endl;
}
//這道題我是用string解決的……感受比較方便
相關文章
相關標籤/搜索