二维数组名和指针

本文深入探讨了C++中二维数组的定义、初始化及应用实例,并通过具体代码展示了数组名、地址运算符以及指针在二维数组中的用法。此外,还介绍了一种高效的查找算法来判断一个整数是否存在于已排序的二维数组中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

#include <iostream>
using namespace std;

#define M 2
#define N 3

int main()
{
    int a[M][N] = {1,2,3,4,5,4}; 
    cout<<&(a[0])<<endl;    //00DCFA64
    cout<<&(a[0])+1<<endl;  //00DCFA70,offest:12
    cout<<a<<endl;          //00DCFA64,a=&(a[0]),
    cout<<a+1<<endl;        //00DCFA64

    cout<<&(a[0][0])<<endl;   //00DCFA64
    cout<<&(a[0][0])+1<<endl; //00DCFA68,offest:4
    
    int* ptr = (int*)(a);  //ptr=&(a[0][0])
    cout<<ptr<<endl;       //00DCFA64

    //for(int i = 0; i < sizeof(a)/sizeof(int); i++)
    //{
    //    if((*ptr++) == 4)
    //    {
    //        cout << "i=" << i/N << ", j=" << i%N << endl;
    //    }
    //}
    return 0;
}

&a[0]、&a[0][0]的值是相等的,但意义不同(对编译器来说),因为a[0] 保存的是一个指向一个具有3个元素的整型数组,而&a[0]则是获取这个数组的地址, 同样对于a[0][0]来说,a[0][0]是a[0]数组中的第一个数据,也就是一个整数,&a[0][0]则是这个整数的地址,因此在指针操作上结果不同。

理解上,变量a是一个具有2个元素的数组,这2个元素是一个具有3个元素的整型数组。  

int a[M][N] = {1,2,3,4,5,4};  写成 int a[M][N] = {{1,2,3},{4,5,4}};  更容易理解。

数组名a=&a[0] 

另外,二维数组在内存中占据连续的空间,在内存中从上到下存储各行元素,在同一行中按照从左到右的顺序存储。因此,可以考虑定义一个指针 int* ptr = (int*)(a); ,更方便地访问二维数组的元素。

#include <iostream>
using namespace std;

// 二维数组matrix中,每一行都从左到右递增排序,
// 每一列都从上到下递增排序
//判断一个整数是否在该二维数组中
bool Find(int* matrix, int rows, int columns, int number)
{
    bool found = false;

    if(matrix != NULL && rows > 0 && columns > 0)
    {
        int row = 0;
        int column = columns - 1;
        while(row < rows && column >=0)
        {
            if(matrix[row * columns + column] == number)
            {
                found = true;
                break;
            }
            else if(matrix[row * columns + column] > number)
                -- column;
            else
                ++ row;
        }
    }

    return found;
}

 上例中,在给函数Find()传递参数时,要用(int*)matrix,而不能直接使用二维数组名matrix。

注意数组内元素的索引方式。

转载于:https://www.cnblogs.com/conard/p/4889677.html

### 二维数组指针指针数组的区别及使用方法 #### 一、概念区分 1. **二维数组指针** 二维数组指针是一个指向二维数组指针,其定义形式为 `int (*p)[N]`,其中 `N` 表示二维数组中每行的元素个数。这种指针可以用来直接访问整个二维数组,或者逐行访问数组的内容[^1]。 2. **指针数组** 指针数组是一个数组,其中每个元素都是一个指针。其定义形式为 `int *p[M]`,其中 `M` 表示数组的长度。指针数组中的每个元素可以指向不同的内存地址,通常用于存储多个字符串或动态分配的数组[^1]。 #### 二、定义方式 1. **二维数组指针的定义** 定义一个二维数组指针时,需要明确二维数组的列数。例如: ```c int arr[3][4] = {{1, 3, 5, 7}, {2, 4, 6, 8}, {11, 22, 33, 44}}; int (*p)[4]; // 定义一个指向包含4列的二维数组指针 p = arr; // 将指针指向二维数组 ``` 2. **指针数组的定义** 定义一个指针数组时,不需要指定列数,而是指定数组中指针的数量。例如: ```c int a = 10, b = 20, c = 30; int *p1[3]; // 定义一个包含3个指针指针数组 p1[0] = &a; p1[1] = &b; p1[2] = &c; ``` #### 三、操作方式 1. **二维数组指针的操作** - 通过二维数组指针访问数组元素时,可以直接使用 `(*p)[j]` 或 `p[i][j]` 的形式。 - 示例代码: ```c #include <stdio.h> int main() { int arr[3][4] = {{1, 3, 5, 7}, {2, 4, 6, 8}, {11, 22, 33, 44}}; int (*p)[4]; // 定义一个指向包含4列的二维数组指针 p = arr; for (int i = 0; i < 3; i++) { for (int j = 0; j < 4; j++) { printf("%d ", p[i][j]); // 访问二维数组元素 } printf("\n"); } return 0; } ``` 上述代码中,`p[i][j]` 等价于 `(*(p + i))[j]`,表示访问第 `i` 行第 `j` 列的元素[^2]。 2. **指针数组的操作** - 指针数组中的每个元素可以独立指向不同的地址。 - 示例代码: ```c #include <stdio.h> int main() { int a = 10, b = 20, c = 30; int *p1[3]; // 定义一个包含3个指针指针数组 p1[0] = &a; p1[1] = &b; p1[2] = &c; for (int i = 0; i < 3; i++) { printf("%d ", *p1[i]); // 解引用指针数组中的指针 } return 0; } ``` 在上述代码中,`*p1[i]` 表示解引用指针数组中的第 `i` 个指针,获取其所指向的值[^3]。 #### 四、注意事项 1. 二维数组指针在定义时必须明确列数,因为编译器需要知道每一行的大小以便正确计算偏移量。 2. 指针数组中的每个指针可以指向不同的地址,但它们本身是连续存储的。 3. 当通过指针访问二维数组时,`p + 1` 表示指向下一整行的地址,而 `*p + 1` 表示指向同一行的下一个元素[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值