系統複習:關於數組訪問與指針數組

代碼及部分解析來源於課本,周靄如的課本,靜下心看真的挺不錯的。

//用不同方式訪問數組

#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)
*/


轉專業 沒辦法,,前面學的並不是很系統,很紮實。一直知道路阻且長,今天知道後半句,行之將至。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章