Coursera課程筆記----C程式設計進階----Week 5
阿新 • • 發佈:2020-05-10
##指標(二) (Week 5)
### 字串與指標
* 指向陣列的指標
* int a[10]; int *p; p = a;
* 指向字串的指標
* 指向字串的指標變數
* char a[10]; char *p; p = a;
```C++
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<(c)<(pc)<
using namespace std;
int main()
{
char buffer[10] = "ABC";
char *pc;
pc = "hello";//學習指標之前,我們無法直接賦值,只能在定義的時候這樣直接賦值
cout<
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⬇️
```C++
int main()
{
int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
cout<<" a ="<
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 二維陣列右上左下遍歷
```C++
#include
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 = "< = 0 && r < row && c < col && c >= 0) {//通過這個,找到在範圍內的。
cout << *(*(shuzu + r) + c) << endl;//只打印在範圍內的
}
c--;//因為是由右邊到左邊,所以C--
}
}
return 0;
}
//要想象到"畫面外的虛線"
```
#### Quiz3 文字排版
```C++
#include
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<