使用指针访问一维数组

本文介绍了一种使用指针来遍历和打印数组元素的方法。通过四个不同的循环示例展示了如何利用指针来访问数组中的每个元素,并比较了不同方式下数组元素的输出效果。
#include <stdio.h>
// 使用指针操作数组 -- 遍历
int main(void)
{
    int nums[5] = {1,3,5,7,9};
    int * p_num;
    p_num = nums; // or p_num = &nums[0];
    printf("ww current array is : ");
    for(int i=0; i<5; i++)
    {
        printf("%d\t",*(p_num+i));
    }

    printf("\nxx current array is : ");
    for(int i=0; i<5; i++)
    {
        printf("%d\t",*(p_num+i));
    }

    printf("\nyy current array is : ");
    p_num = &nums[0];
    for(int i=0; i<5; i++)
    {
        printf("%d\t",*(p_num++));
    }

    printf("\nzz current array is : ");
    p_num = nums;
    for(int i=0; i<5; i++)
    {
        printf("%d\t",*(p_num++));
    }

    return 0;
}
/*
print -->
ww current array is : 1 3       5       7       9
xx current array is : 1 3       5       7       9
yy current array is : 1 3       5       7       9
zz current array is : 1 3       5       7       9
*/
### 如何使用一维指针正确访问C/C++中的二维数组 在一维指针用于访问多维数组的情况下,理解内存布局至关重要。对于二维数组而言,其实际存储方式是一维连续空间,在逻辑上被视作具有行和列结构的数据集合。 #### 方法一:通过计算偏移量来间接索引 当定义了一个`int a[M][N];`类型的二维整型数组时,可以通过指向该类型基础数据(即`int* ptr=a[0];`),利用地址算术运算实现遍历操作[^1]: ```c++ #include <iostream> using namespace std; const int M = 3; // 行数 const int N = 4; // 列数 void printArray(int *ptr) { for (int i = 0; i < M; ++i) { for (int j = 0; j < N; ++j) { cout << *(ptr + i * N + j) << " "; // 使用偏移量访问元素 } cout << endl; } } int main() { int array[M][N] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}}; int (*p)[N] = array; // 定义一个指向含有N个整数的一维数组指针 printArray(*p); } ``` 此方法的核心在于将二维坐标转换成线性序列中的位置,从而允许程序仅依赖单层间接寻址完成对整个矩阵内任意单元格的操作。 #### 方法二:直接声明为指向特定长度数组的指针 另一种更为直观的方式是创建专门针对目标维度设计的指针对象,比如上述例子中可以这样写: ```cpp // 声明一个指向包含N个整数的一维数组指针 int (*pointerToRow)[N]; pointerToRow = &array[0]; for (size_t row = 0; row < M; ++row){ for (size_t col = 0; col < N; ++col){ printf("%d ", (*pointerToRow)[col]); } pointerToRow++; putchar('\n'); } ``` 这种方式不仅提高了代码可读性和维护便利度,而且减少了可能出现错误的风险,因为编译器能够更好地帮助检测潜在问题并提供更精确的帮助信息。 这两种技术都可以有效地处理由单一指针管理多个维度的情况;选择哪种取决于具体应用场景和个人偏好。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值