代碼及部分解析來源於課本,周靄如的課本,靜下心看真的挺不錯的。
//用不同方式訪問數組
#include<iostream>
using namespace std;
int main()
{
int a[] = { 1, 3, 5, 7, 9 }, i, *p;
for (i = 0; i < 5; i++) //1 用下標方式訪問數組
cout << "a[" << i << "]=" << a[i] << '\t';
cout << endl;
for (p = a, i = 0; i < 5;i++) //2 用指針變量下標方式訪問數組
cout << "a[" << i << "]=" << p[i] <<'\t';
cout << endl;
for (i = 0; i < 5;i++) //3 用指針方式訪問數組
cout << "a[" << i << "]=" << *(a+i) << '\t';
cout << endl;
for (p = a; p < a + 5;) //4 用指針變量間址方式訪問數組
{
cout << "a[" << p - a << "]=";
cout << ++(*p) << '\t';
}
/* for (p = a; p < a + 5;p++) //4 用指針變量間址方式訪問數組
cout << "a[" << i << "]=" << *p << '\t';
cout << endl;*/
}
/*方法1 直接用數組下標訪問變量,方法2先執行p=a,整型指針變量p獲取數組a的地址,因此可以用p作爲下標訪問數組,方法3和4都是以指針的方式訪問數組,
但效率不同。方法3用a+i計算元素的地址,訪問效率和下標方式訪問一樣,都先通過數組地址計算偏移值,然後才能找到相應元素,但方法4中,指針變量做p++
運算,不必每次計算數組元素的地址,處理速度比較快。
注意,for(i=0;i<5;i++) 是錯誤的,因爲a的值是內存分配的直接地址,他是在編譯時確定的一個常指針,企圖執行a++,把a作爲左值修改時錯誤的。
第一個 方法4 *(p++)相當於:先讀出*p輸出,然後執行p++
若把*(p++)換成 *p++ *(++p) *++p (*p)++ ++(*p) 會出現什麼情況?
1、 *p++
輸出正常,與*(p++)等價
2、 *(++p) *++p
輸出異常 3 5 7 9 -858993460
*(p++)是先執行,後指針p累加,指向下一個地址
*(++p)是先將pj加一後再指向結果所在的地址
3、 (*p)++ ++(*p)
死循環
*p++是先取出*p的值,然後讓p++
(*p)++是先取出*p的值,讓這個值++
編譯器認爲*和++是同優先級操作符,且都是從右至左結合的,所以*p++中的++只作用在p上,和*(p++)意思一樣;在(*p)++中,
由於()的優先級比*和++都高,所以++作用在()內的表達式*p上。
*/
//用指針數組調用函數
#ifndef FUNC_H
#define FUNC_H
const double PI = 3.1415;
double Square_Girth(double l){ return 4 * l; }
double Square_Area(double l){ return l*l; }
double Round_Girth(double r){ return 2 * PI*r; }
double Round_Area(double r){ return PI*r*r; }
#endif
#include<iostream>
using namespace std;
#include"func.h"
int main()
{
int i;
double x = 1.23;
double(*pfun[4])(double); //說明指向函數的指針數組
pfun[0] = Square_Girth; //獲取函數入口地址
pfun[1] = Square_Area;
pfun[2] = Round_Girth;
pfun[3] = Round_Area;
for (i = 0; i < 4; i++)
cout <<(* pfun[i])(x) << endl;
}
/* pfun數組長度爲4,元素指向返回同類型爲double型數值,切具有一個double型參數的函數。punf的每一個元素獲取了
不同函數的入口地址。
(*pfun[i])(x)可以寫成pfun[i](x)
*/
轉專業 沒辦法,,前面學的並不是很系統,很紮實。一直知道路阻且長,今天知道後半句,行之將至。