您的位置:首页 > 其它

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

2016-05-19 00:01 197 查看
代码及部分解析来源于课本,周霭如的课本,静下心看真的挺不错的。

//用不同方式访问数组

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


转专业 没办法,,前面学的并不是很系统,很扎实。一直知道路阻且长,今天知道后半句,行之将至。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: