系统复习:关于数组访问与指针数组
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上。
*/
转专业 没办法,,前面学的并不是很系统,很扎实。一直知道路阻且长,今天知道后半句,行之将至。
//用不同方式访问数组
#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) */
转专业 没办法,,前面学的并不是很系统,很扎实。一直知道路阻且长,今天知道后半句,行之将至。
相关文章推荐
- 安装sklearn库遇到的一些问题的解决
- 字符、字节的概念及其区别
- Android xml资源文件中@、@android:type、@*、?、@+含义和区别
- 拖拽多个对象到盒子内
- 新站 百度 seo
- redis入门——redis特性
- selenium之操作ChromeDriver
- WebView的用法
- RESTful API规范
- 前端路由实现与 react-router 源码分析
- Js 笔记
- 重载与重写
- List<String> String[] 之间的转化
- 转发 重定向 forward redirect
- sonar常见错误以及处理方案
- ImportError: cannot import name process_pdf 解决方法
- opencv切割图片,用于训练样本
- 在marathon上部署mesos-dns服务(解决无法启动,部署失败)
- 如何建立起一套有效的APP监控体系
- 移动互联网安全是企业发展的重要环节