指针和数组

编译器在编译的时候会将数组名转化为对应类型的指针

数组注意点

不能直接用一个数组初始化另一个数组,也不能用一个数组给另一个数组赋值

void arrayassigntest()
{int a[10]={0};int b[10]=a;
}

此时提示数组可以用大括号的方式初始化,第四行用指针初始化数组,所以报错

void arrayassigntest()
{int a[10]={0};int b[10]={0};a=b;
}

如果用一个数组给另一个数组初始化,会提示数组赋值无效

上述两种情况的原因都是在于使用数组名的时候,会将数组名转为指针

使用指针遍历数组

void traversearraybyp()
{int a[7]={1,2,3,4,5,6,7};int *s=a;int *e=&a[7];for (int *p=s;p!=e;++p) {cout<<*p<<endl;}/*for (int i=0;i<sizeof(a)/sizeof(a[0]);++i) {cout<<a[i]<<endl;}*/
}

int *e=&a[7]指向了尾后元素之后的地址,类似于尾后迭代器

当指针指向数组的某个元素时,用指针和下标访问数组时,下标可以为负数

void negativeindex()
{int a[7]={1,2,3,4,5,6,7};int *p=&a[4];cout<<p[-2]<<endl;
}

复杂数组声明的理解

数组本身是对象,所以存在数组的指针和数组的引用,而指针也是对象,所以存在指针的数组,但是引用不是对象,所以不在引用的数组

int *p[10]={nullptr};//指针的数组,每个数组的内容都是一个int指针
//int &r[10]; 错误,不存在引用的数组

因为数组的指针是对象,所以还存在数组的指针的引用和数组的指针的指针

int a[10]={0};
int *p[10]={nullptr};int (*ap)[10]=&a;//ap指针指向一个长度为10的int数组
int (&ar)[10]=a;//ar是数组a的引用
int *(*app)[10]=&p;//app是指针数组的指针
int *(&apr)[10]=p;//apr是指针数组的引用

注意,这里int (*ap)[10]=&a不能写成int (*ap)[10]=a,因为a是int数组,编译时被解读为指针,而不是数组的指针

同理,int *(*app)[10]=&p也不能写成int *(*app)[10]=p,因为p是指针数组,编译时被解读为指针的指针

关于ap ar app的识别方法如下

int (*ap)[10],先看括号里面的ap,我们知道这是一个变量,看到前面的*,判断这是个指针,之后 看到[10],断定该指针指向一个数组,最后看到int,知道指向的数组元素类型是int

int (&ar)[10],先看括号里面的ar,我们知道这是一个变量,看到前面的&,判断这是个引用,之后 看到[10],断定该引用绑定一个数组,最后看到int,知道绑定的数组元素类型是int

int *(*app)[10],先看括号里面的app,我们知道这是一个变量,看到前面的*,判断这是个指针,之后 看到[10],断定该指针指向一个数组,最后看到int *,知道指向的数组元素类型是int指针

int *(&apr)[10],先看括号里面的apr,我们知道这是一个变量,看到前面的&,判断这是个引用,之后 看到[10],断定该引用绑定一个数组,最后看到int *,知道绑定的数组元素类型是int指针

总的来说,数组的指针和引用,以及数组指针的指针的读法是括号内,然后两边

使用数组指针二维数组

void twodimarray()
{int a[3][4]={1,2,3,4,5};for (int (*ap)[4]=&a[0];ap<&a[0]+3;++ap) {分别取行地址for (int *p=ap[0];p<ap[0]+4;++p) {分别遍历每行cout<<*p<<endl;}}
}

参考:

《C++ Primer》

欢迎大家评论交流,作者水平有限,如有错误,欢迎指出

C++知识点6——数组与指针初步相关推荐

  1. C语言再学习 -- 再论数组和指针

    之前有总结指针数组,但是现在看来总结的太简单了.好多重要的知识点都是一带而过的.本想在后面添加后来想想算了,还是再写一篇文章来详细介绍数组和指针这对冤家吧. 之前总结的,参看:C语言再学习 -- 数组 ...

  2. 一维数组,二维数组,三维数组,数组与指针,结构体数组,通过改变指针类型改变访问数组的方式

     打印数组中的每个元素,打印每个元素的地址: #include <stdio.h> #include <stdlib.h> void main(void) { int a[ ...

  3. 指针 数组指针 指针数组 函数指针等说明。

    指针的概念 原文地址:http://www.cnblogs.com/ggjucheng/archive/2011/12/13/2286391.html 指针是一个特殊的变量,它里面存储的数值被解释成为 ...

  4. c/c++ 数组和指针

    c/c++ 数组和指针 知识点 1,数组就是指针,对应代码里的test1 2,用auto声明,得到的是指针,对应代码里的test2 3,用decltype声明,得到的不是指针 ,对应代码里的test3 ...

  5. c语言二维数组 ppt,C语言二维数组与指针.ppt

    C语言二维数组与指针.ppt 好好考,全国计算机等级考试 二级C语言,第12讲 二维数组与指针,二维数组的定义 数组元素的引用及初始化 二维数组和指针 二维数组名和指针数组作为实参 二维数组程序举例 ...

  6. 【C++】数组和指针的爱恨情仇。。。

    前言   最近研究C++中的数组怎么作为参数传入到函数中,自然而然引出了这篇博客的标题,即数组和指针的爱恨情仇... 1 数组和指针都是啥?   想要知道数组和指针交织在一起会摩擦出怎样的火花,那就先 ...

  7. C++中数组和指针的关系(区别)详解

    C++中数组和指针的关系(区别)详解 本文转自:http://c.biancheng.net/view/1472.html 博主在阅读后将文中几个知识点提出来放在前面: 没有方括号和下标的数组名称实际 ...

  8. C语言指针数组,数组指针,函数指针,函数指针数组,函数指针数组的指针,回调函数

    C语言指针的一些知识点 指针 指针数组和数组指针的概念 函数指针,函数指针数组,函数指针数组的指针 回调函数 指针 1.指向对象的指针 int *p = new int(10); delete p; ...

  9. C++ 笔记(27)— 指针变量、数组和指针、指针数组、数组指针、指针常量与常量指针

    1. 什么是指针变量? 指针变量是专门有一个变量来存放指针. int main(int argc, char *argv[]) {int a = 10;int *p = &a; //通过取地址 ...

最新文章

  1. Pandas把dataframe的索引、复合索引变换为数据列:包含单索引到单列(重命名)、复合索引到多数据列、复合索引的其中一个水平变换为数据列、
  2. Django缓存和信号
  3. 为啥辣椒会辣得人嘴巴疼?这个问题竟然和今年诺奖有关
  4. python求5_python5
  5. IE6Bug,外层container设置了overflow:auto,但是内层嵌套元素有position:relative的时候,显示错误。...
  6. c语言创建学生成绩表,C语言创建信息链表,求助
  7. linux unix mac windows,文件路径-windows上的反斜杠和Mac OS/Linux/Unix上的正斜杠,Windows,倒,以及,macOSLinuxUNIX...
  8. mysql查询值替换_MySQL选择查询替换值
  9. 免费送《你的知识需要管理》签名书活动,秒杀
  10. NLP提效,除了选择合适的模型,就是数据增强了
  11. pg(高斯)(postgreSQL)数据库修改字段长度
  12. 下docfetcher先下Java,DocFetcher ── 以 JAVA 编写的开源桌面本地文件全文搜索工具...
  13. A.B.C类地址的私有地址、局域网地址、保留地址
  14. ECS云服务器详细配置
  15. 打印机不能正常打印怎么办
  16. 系统中负负得正的兼容逻辑也许暂时能跑起来, 但迟早会坑人!
  17. 机器学习api_开发人员会喜欢的10种机器学习API
  18. simulink【1】分段函数
  19. 计算机应用基础练习题题(史上最全)
  20. 企业密钥管理(EKM)行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)

热门文章

  1. SilverLight.3-Validation:二、银光验证。TheLabel、TheDescriptionViewer和TheValidationSummary...
  2. gulp关于scss的基础配置
  3. knockout之自定义绑定
  4. 2020.12.07.记录
  5. Windows应用程序进程级别统一监控实践
  6. 基于微信的图片放大预览
  7. Linux Java Web 服务器搭建之tomcat安装
  8. centos下kong源码安装
  9. 解决Python2.7的UnicodeEncodeError: ‘ascii’ codec can’t encode异常错误
  10. 六,ESP8266 TCP Client(基于Lua脚本语言)