C++ 数组(及二维数组)与指针(互转遍历),数组与引用
Posted 匆忙拥挤repeat
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 数组(及二维数组)与指针(互转遍历),数组与引用相关的知识,希望对你有一定的参考价值。
文章目录
I. 数组与指针互转
I.i. 数组的一个基本性质就是能看成一个指针
int ary[] = 1,2,3;
int *p = ary;
cout << p[1] << endl; //当成数组
cout << *(p + 1) << endl; //当成指针
以上两个输出值相等。
cout << p[-1] << endl; //指针变量p表示数组时,下标可以为负数
cout << *(p - 1) << endl;
以上两个输出值相等。
I.ii. 内存空间
数组在内存中是存储在一块连续的内存空间。
它的首地址 = 首元素的地址。
I.iii. 求静态数组大小
sizeof(type) ,求出某种类型所占字节数。
type 为数组类型时,而会求出整个数组所占空间。
int len = sizeof(ary) / sizeof(ary[0]);
int len = sizeof(ary) / sizeof(*ary);
int len = sizeof(ary) / sizeof(int);
对于动态数组, new[] ,是无法获取大小的。
II. 一维数组遍历
II.i. 有结束字符
如,c风格的字符数组'a', 'b', 'c', '\\0'
,组成了一个字符串:"abcde"
, '\\0’是字符串的终止符。
void test(const char *p)
while (*p) //所指非空
cout << *p++; //先*p, 再p++
II.ii. 使用标准库中,首、尾元素指针,进行遍历
#include <iostream>
#include <iterator>
void test(const int *begin, const int *end)
while (begin != end)
cout << *begin++ << endl;
//调用
test(begin(ary), end(ary));
II.iii. 有数组大小,再遍历
for (int i = 0; i < num; ++i)
III. 数组引用
III.i. 形参固定大小
void test(int (&ary)[10])
for (auto a: ary)
cout << a << endl;
int ary = ...;
//调用
test(ary);
注意:引用形参前后有小括号,后面有[] ,且必须有数组大小。 实参与形参的大小不同,会编译错误。
而,int &ary[10] //这表示引用的数组
III.ii. 定义模板,以传递任意大小的数组
template<typename T,int N>
void test(T (&ary)[N]) // 形参变量名为 ary 的 大小为N 的 T 类型数组引用(&)
IV. 二维数组与指针
IV.i. 二维数组内存分布
c++ 的二维数组,实际是数组的数组。
int ary[2][10] = 1, 2, 3, 4 ; //2个含有10个元素的一维数组. 可看成 2行10列。
int ary[][5] = 7, 8, 9, 10 ; //自动推断出, 第一维是2。
如上二维数组内存中的分布, 相当于整体平铺成一个一维数组。若把 第一维用 *p 表示:
*p 地址:0x00007ffeed7c3128
*(p+1) 地址:0x00007ffeed7c313c
IV.ii 二维数组作形参并遍历
IV.ii.a. 固定第二维,第一维是指针或数组
#include <iostream>
using namespace std;
//void print1(int matrix[][5], const int rowSize) //第一维长度为空,实际是rowSize的值
void print1(int (*matrix)[5], const int rowSize) //用指针替代第一维。
//matrix 就是行指针,每移到1,其实就移动了 列的个数,即5。
//内部的 < 或 != 可以相互替换。
for (auto p = matrix; p < matrix + rowSize; ++p)
//*p 是一维数组,赋值给指针 *q。
for (auto *q = *p; q != *p + 5 ; ++q)
cout << *q << " ";
cout << endl;
//直接当成数组进行遍历
for (int i = 0; i < rowSize; ++i)
for (int j = 0; j < 5; ++j)
cout << matrix[i][j] << " ";
cout << endl;
//调用
print1(ary, sizeof(ary) / sizeof(ary[0]));
IV.ii.b. 一级指针指代二维数组
void print2(int *matrix, int rowSize, int colSize)
for (int i = 0; i < rowSize; ++i)
for (int j = 0; j < colSize; ++j)
cout << *(matrix + (i * colSize + j)) << " ";
cout << endl;
//调用
print2(reinterpret_cast<int *>(ary), sizeof(ary) / sizeof(ary[0]), 5);
IV.ii.c. 使用二级指针
void print3(int **matrix, int rowSize, int colSize)
for (int i = 0; i < rowSize; ++i)
for (int j = 0; j < colSize; ++j)
//这里必须 重解释成 1级指针,再移位。
// cout << *( reinterpret_cast<int*>(matrix) + (i * colSize + j)) << " ";
cout << *( (int*)matrix + (i * colSize + j)) << " ";
cout << endl;
//调用
//print3(reinterpret_cast<int **>(ary), 2, 5);
print3((int **)ary, 2, 5);
以上是关于C++ 数组(及二维数组)与指针(互转遍历),数组与引用的主要内容,如果未能解决你的问题,请参考以下文章