C++——指针与数组
1.数组名不是指针,神似指针(可以将数组名直接赋值给指针)
(1)数组名的内涵在于其指代实体是一种数据结构,这种数据结构就是数组;
(2)数组名的外延在于其可以转换为指向其指代实体的指针,而且是一个指针常量;
(3)指向数组的指针则是另外一种变量类型(在WIN32平台下,长度为4),仅仅意味着数组的存放地址!
2.数组名只能被看作一个指针常量,不能被修改
int intArray[];
intArray++;//错误
sizeof(intArray)/sizeof(*intArraya)=10;
指针的sizeof就是指针本身的大小
3.作为函数形参
(1)数组名作为函数形参时,在函数体内,其失去了本身的内涵,仅仅只是一个指针;
(2)很遗憾,在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。
所以,数组名作为函数形参时,其全面沦落为一个普通指针!
4.a是数组时,a 和 &a的区别
int a[5]={0,1,2,3,4};
int *p=a;//定义一个int型指针p,指向第一个元素的地址
vector<int> ivec(begin(a),end(a));//用数组初始化vector
vector<int> subvec(a+1,a+3);//用数组初始化vector
int aa[2][5]={0,1,2,3,4,
5,6,7,8,9};
int (*p)[5]=aa;//定义一个int [5] 型指针p,等价于int (*p)[5]=&aa[0];
5.数组,引用和指针
int *ptrs[10];//Y,数组,10个int型指针
int &refs[10];//N,没有引用的数组,
int (*Parray)[10]=&arr; //指针,10个int型数据的数组——————和数组名的区别?
int (&Parray)[10]=arr;//数组的引用,10个int型数据的数组————和数组名的区别?
int *(&Parray)[10]=arr;//数组的引用,10个int型指针的数组————和数组名的区别?
int ia[]={,,,,,};
auto ia2(ia);//ia2是一个整型指针int *,只想ia的第一个元素: auto ia2(&ia[0])
ia2=;//× decltype(ia) ia3={,,,,,};//ia3是一个6个整数的数组
ia3=p;//不能把整形指针赋值给数组
5.1数组的begin和end操作
constexpr size_t sz=;
int arr[sz]={,,,,};
auto n=end(arr)-begin(arr);//n=5,类型为带符号的ptrdiff_t(头文件cstddef)
5.2 数组的下标和指针
int *p=&a[];
int j=p[];//a[3]
int k=p[-];//a[0]
6.
unsigned score[]={,,};
for (auto i : score)
cout<<i<<" ";//4,2,3
7.多维数组:数组的数组
int a[][]={,,,,,,,,,,,};
int a[][]={{},{},{}};//初始化每行的首元素,其余默认
int a[][]={,,};//只初始化了第一行3个元素,其余默认
7.1 多维度数组遍历
constexpr size_t rowCnt =, colCnt=;
int ia[rowCnt][colCnt];
for (size_t i=;i!=rowCnt ;++i){
for (size_t j=;j!=colCnt;++j) {
ia[i][j]=i*colCnt+j;
}
}
/******************/C++
size_t cnt=;
for (auto &row:ia)//为了避免数组被自动转成指针;为了写操作(就算只读,也要用引用)
for (auto &col:row) {
col=cnt;
++cnt;
}
} for (const auto &row : ia)//外层循环必须引用,避免转成指针.row代表一个大小为4的数组
for (auto col:row)
cout<<col<<endl; for (auto row : ia)//外层循环必须引用,报错。此时row被转化成指针,而无法遍历一个int *的指针
for (auto col:row)
7.2 指针和多维数组
int ia[][];//大小为3的数组,每个元素为大小为4的数组
int (*p)[]=ia;//p指向第一个含有4个整数的数组
p = &ia[];//p只想最后一个含有4个整数的数组
int *ip[4];//4个整形指针的数组 /**********/C++11,auto解决了上述问题
for (auto p=ia;p!=ia+3;++p){
for(auto q=*p;q!=*p+4;++q)
cout << *q <<‘ ’ ;
cout<<endl;
}
/*************/上下等价
for (auto p=begin(ia);p!=end(ia);++p){
for (auto q=begin(*p);q!=end(*p);++q)
cout <<*q<<'';
cout<<endl;
}
/**********/上下等价:int_array=4个整数的数组
using it_array = int[4];
typedef int int_array[4];
for (int_array *p=ia;p!=ia+3;++p){
for(int *q=*p;q!=*p+4;++q)
cout<<*q<<'';
cout<<endl;
}
C++——指针与数组的更多相关文章
- C与指针(结构体指针,函数指针,数组指针,指针数组)定义与使用
类型 普通指针 指针数组(非指针类型) 数组指针 结构体指针 函数指针 二重指针 定义方式 int *p; int *p[5]; int (*p)[5]; int a[3][5]; struct{.. ...
- 11-C语言指针&一维数组&字符串
一.用指针遍历数组元素 1.最普通的遍历方式是用数组下标来遍历元素 1 // 定义一个int类型的数组 2 int a[4] = {1, 2, 3, 4}; 3 4 int i; 5 for (i = ...
- 指针与数组的区别 —— 《C语言深度剖析》读书心得
原书很多已经写的很清楚很精炼了,我也无谓做无意义的搬运,仅把一些基础和一些我自己以前容易搞混的地方写一下. 1. 意义: 指针: 指针也是一种类型,长度为4字节,其存放的内容只能是一个地址(4字节). ...
- 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, const 对象的引用
[源码下载] 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, con ...
- 指针 与 数组 以及 a 与 &a的区别
指针 与数组 并没有什么关系, 指针就是指针,指针变量在32位系统下,永远占4个byte,其值为某一个内存的地址,指针可以指向任何地方,但是不是任何地方你都能通过这个指针变量访问到; 数组 ...
- c/c++ 函数指针 指针函数 数组的引用 指针数组 数组指针
1.指针数组数组指针 引用数组 数组的引用 int *a[10] 指针数组 每一个元素都是一个指针 Int (*a)[10] 数组指针 P指向一个含有10个元素的数组 Int (&a)[10] ...
- 深入理解C语言中的指针与数组之指针篇
转载于http://blog.csdn.net/hinyunsin/article/details/6662851 前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本 ...
- 转: 浅谈C/C++中的指针和数组(二)
转自:http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242419.html 浅谈C/C++中的指针和数组(二) 前面已经讨论了指针和数组 ...
- 转:浅谈C/C++中的指针和数组(一)
再次读的时候实践了一下代码,结果和原文不一致 error C2372: 'p' : redefinition; different types of indirection 不同类型的间接寻址 /// ...
- C语言指针与数组的定义与声明易错分析
部分摘自<C语言深度解剖> 1.定义为数组,声明为指针 在文件1中定义: char a[100]; 在文件2中声明: extern char *a; //这样是错误的 这里的extern告 ...
随机推荐
- Python 工程师技能图谱skill-map
# **Python 工程师技能图谱** ## **入门**- 笨办法学Py- 官方教程- Hitchhiker- coursera * codeskulptor.org ## **进阶/脚本** # ...
- 公司-浪潮:浪潮/inspur
ylbtech-公司-浪潮:浪潮/inspur 浪潮集团有限公司,即浪潮集团,是中国本土综合实力强大的大型IT企业之一,中国领先的云计算.大数据服务商.浪潮集团旗下拥有浪潮信息.浪潮软件.浪潮国际.华 ...
- HTML5: HTML5 拖放
ylbtech-HTML5: HTML5 拖放 1.返回顶部 1. HTML5 拖放(Drag 和 Drop) 拖放(Drag 和 drop)是 HTML5 标准的组成部分. 将 RUNOOB.C ...
- JavaScript中 函数的创建和调用
基础概念:定义函数的方式 一般定义函数有两种方式: 1:函数的声明 2:函数表达式 参考资料:https://blog.csdn.net/xixiruyiruyi/article/de ...
- Head First PHP &MySQL学习笔记
最近一段时间在学习PHP,买了<Head First PHP&MySQL>中文版这本书,之前买过<Head First设计模式>,感觉这系列的书籍总体来说很不错. ...
- 自己写IRP,做文件操作,遇到的坑
在写文件的时候没问题,但是写完文件之后,就出问题了, 什么问题呢,是因为写完文件之后,文件关闭之后, 调用了一个叫做 CcFlushCache 的函数,这个函数是从CcWriteBehind 调过来的 ...
- opensns的URL模式
URL模式 如果我们直接访问入口文件的话,由于URL中没有模块.控制器和操作,因此系统会访问默认模块(Home)下面的默认控制器(Index)的默认操作(index),因此下面的访问是等效的: htt ...
- Spring集成RMI实现远程调用
前提: 1.开发工具: jdk tomcat ecplise,开发工具的使用本篇不做介绍. 2.需具备以下知识:javase servelt web rmi spring maven 一.关于RMI ...
- 2016计蒜之道复赛 百度地图的实时路况 分治+Floyd
题目链接:https://nanti.jisuanke.com/t/A1108 这道题还挺有意思的.让我对Floyd的了解又加深了一点. 首先我们重新审视Floyd这三重循环到底有什么用?第一层是枚举 ...
- day02 python流程控制 while循环 格式化输出 运算符 编码
day02 python 一.循环: while循环 while expression: while_suite 1.break 停止当前循环(如果多个循环嵌套, ...