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++ 数组(及二维数组)与指针(互转遍历),数组与引用的主要内容,如果未能解决你的问题,请参考以下文章

c++指针数组与二维数组的最大区别

C++二维数组(指针)做参数

javascript与php一维数组与二维数组互转

第34课 多维数组和多维指针

C# 中锯齿状数组的内存分配与 C++ 中的二维数组内存分配

c++二维数组和二级指针