系统复习:关于数组访问与指针数组

代码及部分解析来源于课本,周霭如的课本,静下心看真的挺不错的。

//用不同方式访问数组

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


转专业 没办法,,前面学的并不是很系统,很扎实。一直知道路阻且长,今天知道后半句,行之将至。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值