如何使用指针访问 3x3 数组从第一个元素到最后一个元素?

问题描述 投票:0回答:2

有没有办法使用指针指向数组的第一个元素,然后循环直到数组末尾?

#include <stdio.h>


int main(){
    int A[50][50][50];
    int sum;
    int i,j,k;
    int row,column,depth;
    int *ptr;
            do {
                printf("Please input row: ");//row
                scanf("%d", &row);
                printf("Please input column: ");//column
                scanf("%d", &column);
                printf("Please input depth: ");//depth
                scanf("%d", &depth);

                if (row <= 0 || column <=0 || depth <=0) {
                    printf("Wrong input!!!\n");
                }
            } while (row <= 0);

            printf("Row is equal to:%d\n", row);
            printf("Column is equal to:%d\n", column);
            printf("Depth is equal to:%d\n", depth);

            for (i=0;i<row ;i++) {
                for(j=0;j<column;j++){
                    for(k=0;k<depth;k++){
                        printf("Please input value for Array[%d][%d][%d]: ", i + 1,j+1,k+1);
                        scanf("%d", &A[i][j][k]);
            }
                }
                    }
            ptr = &A[0][0][0];

        


  printf("\nThe sum of all elements is: %d\n", sum);

}

我正在尝试使用指针计算所有元素的总和并尝试使用循环,但它不起作用是否还有其他方法可以访问它。

这是我的循环的样子:

for(i=0;i<row;i++){
                sum+=*(ptr+i);
                    for(j=0;j<column;j++){
                    sum+=*(ptr+j);
                        for(k=0;k<depth;k++){
                            sum+=*(ptr+k);
            }
                }
                    }

我目前正在学习 C 编程中的指针课程,所以我只知道基础知识。

arrays c pointers
2个回答
0
投票

您需要正确索引指针并确保正确访问 3D 数组的元素。您当前的实现在指针算术方面存在一些问题。

看这段代码

#include <stdio.h>

int main() {
    int A[50][50][50];
    int sum = 0;
    int i, j, k;
    int row, column, depth;
    int *ptr;

    do {
        printf("Please input row: ");
        scanf("%d", &row);
        printf("Please input column: ");
        scanf("%d", &column);
        printf("Please input depth: ");
        scanf("%d", &depth);

        if (row <= 0 || column <= 0 || depth <= 0) {
            printf("Wrong input!!!\n");
        }
    } while (row <= 0 || column <= 0 || depth <= 0);

    printf("Row is equal to: %d\n", row);
    printf("Column is equal to: %d\n", column);
    printf("Depth is equal to: %d\n", depth);

    for (i = 0; i < row; i++) {
        for (j = 0; j < column; j++) {
            for (k = 0; k < depth; k++) {
                printf("Please input value for Array[%d][%d][%d]: ", i + 1, j + 1, k + 1);
                scanf("%d", &A[i][j][k]);
            }
        }
    }

    
    ptr = &A[0][0][0];

    
    for (i = 0; i < row; i++) {
        for (j = 0; j < column; j++) {
            for (k = 0; k < depth; k++) {
                sum += *ptr; 
                ptr++;
            }
        }
    }

    printf("\nThe sum of all elements is: %d\n", sum);

    return 0;
}

确保将 sum 初始化为 0 不要为每个维度使用单独的循环,并记住指针直接在最内层循环内递增 访问 *ptr 处的值后,递增 ptr 以指向下一个整数 确保在 do while 循环中检查所有维度的正值


0
投票

严格且最正确地说,您不能使用

int A[50][50][50];
类型的指针迭代数组
int*

原因是

arr[i]
是 100% 等效形式
*(arr + i)
的“语法糖”,因此数组访问归结为的规则始终是使用
+
运算符的指针算术。形式上,该运算符具有 C17 6.5.6 中指定的限制:

如果指针操作数和结果都指向同一个数组对象的元素,或者超过数组对象的最后一个元素,则求值不会产生溢出;否则,行为是未定义的。

当您执行

ptr = &A[0][0][0];
时,您将
int* ptr
设置为指向
int [50]
类型的第一个数组。
ptr
的连续迭代和访问仅在该
int [50]
数组内定义。无论您使用
ptr[i]
还是
ptr++ ... *ptr
。一旦你越过了第一个数组,如果你从那里取消引用指针,你就会调用未定义的行为。

实际上,编译器被迫将整个事情作为数组的数组的数组分配在相邻内存中,因此通常也会生成有效的代码,即使 C 语言对此不做任何保证。但是依赖未定义行为编写代码是危险且脆弱的。因此,如果您从一位向您“证明”“它有效”的老师那里得到这个任务,请通过链接他们这篇文章来向我发送他们:)您无法通过实际证明依赖于未定义行为的代码“有效”实验(请参阅什么是未定义行为以及它是如何工作的?

正如此异地副本中所提到的我可以从指向与数组相邻但在数组之外的对象的指针访问数组元素吗?,一种可能的解决方法是使用指向字符类型的指针。然后,由于有关字符类型的特殊规则,编译器被迫查看整个

int A[50][50][50];
,就像它是
unsigned char A[50*50*50*sizeof(int)]
一样,从那里您可以逐字节访问它。

© www.soinside.com 2019 - 2024. All rights reserved.