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

来源:互联网 发布:邹平php 编辑:程序博客网 时间:2024/06/05 20:05

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

//用不同方式访问数组#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_Hconst 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)*/


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

0 0
原创粉丝点击