C++指针数组、数组指针、数组名及二维数组技巧汇总
本文较为详细的分析了关于理解C++指针数组,数组指针,数组名,二维数组的一些技巧。是比较重要的概念,相信对于大家的C++程序设计有一定的帮助作用。
一、关于数组名
假设有数组:
inta[3]={1,2,3}
1.数组名代表数组第一个元素的地址,注意,不是数组地址(虽然值相等),是数组第一个元素地址,a等同于&a[0];
a+1是第二个元素的地址。比第一个元素地址a(或者&a[0])超出了一个整型指针的大小,在这里是4个字节(byte)
cout<<a<<endl;//会输出数组第一个元素地址。
2.取址符号&.
&a+1比数组的地址&a超出了一个数组的地址大小,在这里是3*4个字节
应该赋值给数组指针(下面会讲到)。
关于数组名,切记以上两点。
二、关于指针数组
1.定义
指针数组,就是存放指针的数组,数组里的元素是指针(对比于整型数组,整型数组就是存放整型的数组,数组里的元素是整型)
int*ptr[3];如何理解?按照运算符优先级,[]优先级较大,所以ptr先与[3]结合,表示ptr是一个数组,必然要明确数组的元素类型,所以数组里的元素类型是整型指针(int*),数组的大小不一定需要(定义数组时可以根据初始化的元素个数确定)
ptr[0]就是数组的第零个元素,它是一个整型指针。
示例如下:
inta[3]={1,2,3}; intx=5; ptr[0]=&x; ptr[1]=&a[2];
2.如何使用?
像一般指针一样使用。*ptr[0]就是第零个元素(一个指针)所指向元素的值,这里是5。
三、关于数组指针
1.定义
数组指针,就是指向数组的指针,它是一个指针,指向一个数组(对比于整型指针,就是指向整型的指针,它是一个指针,指向一个整型)
int(*ptr)[3];如何理解?先看小括号里面,*ptr说明ptr是一个指针,然后跟[]结合表明这个指针指向一个数组,数组的元素是int
inta[3]={1,2,3}; int(*ptr)[3]=a;//这条语句不成立。
右边a是数组名,还记得上面说的吗,数组名代表数组第一个元素的地址,就是&a[0],数组名的类型相当于整型指针(不知道事实上是不是)int*,因为它指向了第一个元素,第一个元素是int
左边ptr的类型是int(*)[],是数组指针,指向数组的指针,不是指向整型的指针,不能赋值。
inta[3]={1,2,3}; int(*ptr)[3]=&a;//正确。
因为a是一个数组,&a就是数组的地址,还记得上面说的吗?
2.如何使用?
inta[3]={1,2,3}; int(*ptr)[3]=&a; cout<<(*ptr)[0]<<endl;//输出1 cout<<(*ptr)[1]<<endl;//输出2
这里有一点难以理解。不防对比一下一下代码。
inta[3]={1,2,3}; intx=5; int*p=&x; cout<<*p<<endl;//输出5
p是一个指向整型的指针,*p就是所指向的变量(整型x)的值。同理ptr是指向数组的指针,*ptr就是所指向的变量(数组a)的值。(*ptr)[0]就是数组的第零个元素。
四、关于二维数组
1.二维数组是一个数组,它的元素是一维数组。谨记这一点,然后把上面的套进来就行了。
inta[3][3]={{1,2,3},{4,5,6},{7,8,9}};
数组名
a是数组第一个(或者说第零个更好)元素的地址,第一个元素是一维数组,a[0]------>{1,2,3}。a+1是第二个元素的地址,就是第二个一维数组的地址,超出了3*4个字节
&a是数组的地址,&a+1就是超出了一个二维数组的大小,超出了3*4*3个字节。
数组指针
int(*ptr)[3]=a;//正确。
因为a表示第一个元素的地址,第一个元素是一个一维数组,所以a表示一个一维数组的地址,一个数组的地址赋值给数组指针,成立。
五、总结:
1.
2.
3.
4.
5.
相关文章
- Modern C++ 最核心的变化是什么?
- EasyC++09,C++中的数组
- EasyC++16,指针初探(二)
- C++编程语言中重载运算符(operator)介绍「建议收藏」
- C++ 指针的两种操作,通过指针赋值 & 对指针赋值「建议收藏」
- 深入理解C++11_c++ string char
- C++数组搜索(二分法)
- C++枚举数组的排列状态
- 【c++】【基础】【primer_plus】【第四章】数组与复合类型
- C++基本概念_c语言 c++区别
- C++ 中的字符串数组(5 种不同的创建方式3-5)
- C++ 不知树系列之认识二叉树(数组、链表存储的实现)
- c++的链表-链表入门(C++)
- c++的链表-C++实现简单链表
- C++ 中文周刊 第94期
- C++STL——map与set介绍及使用
- C++ URLencode library详解编程语言
- C++数据类型(强制)转换详解
- C++ list(STL list)增加和插入元素详解(insert成员函数插入元素)
- Microsoft Visual C++ 2019 v14.26.28720.3 官方版
- C++拷贝构造函数(深拷贝与浅拷贝)详解
- c++将数组名作为函数参数对数组元素进行相应的运算
- c++String去除头尾空格的方法
- C++实现读取特定路径下文件夹及文件名的方法