首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数组指针是如何运行的?

数组指针是如何运行的?
EN

Stack Overflow用户
提问于 2022-07-21 22:09:37
回答 2查看 78关注 0票数 0

我正试图编写代码,以便将乘法表存储在数组中。

首先,我编写了以下代码。

代码语言:javascript
复制
#include<stdio.h>

void Multiplication(int arr[][10], int num,int size);

int main(){
    int arr[3][10];
    Multiplication(&arr[0],2,3);
    Multiplication(&arr[1],7,3);
    Multiplication(&arr[2],9,3);
    for(int i=0;i<3;i++){
        printf("\n\nMultiplication Table of %d\n\n",arr[i][0]);
        for(int j=0;j<10;j++){
            printf("%d * %d = %d\n",arr[i][0],j,arr[i][j]);
        }
    }
    return 0;
}

void Multiplication(int arr[][10], int num, int size){
    for(int j=0;j<size;j++){
        for(int i=0;i<10;i++){
            arr[j][i] = num * (i+1);
        }
    }
}

当我检查是否有红色的部分时,我取下了一些碎片。

代码语言:javascript
复制
#include<stdio.h>

void Multiplication(int *arr, int num,int size);

int main(){
    int arr[3][10];
    Multiplication(arr[0],2,3);
    Multiplication(arr[1],7,3);
    Multiplication(arr[2],9,3);
    for(int i=0;i<3;i++){
        printf("\n\nMultiplication Table of %d\n\n",arr[i][0]);
        for(int j=0;j<10;j++){
            printf("%d * %d = %d\n",arr[i][0],j,arr[i][j]);
        }
    }
    return 0;
}

void Multiplication(int *arr, int num,int size){
        for(int i=0;i<10;i++){
            arr[i] = num * (i+1);
        }
}

现在,我注意到&arr和arr的行为是一样的?我想知道为什么会这样?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-07-21 22:40:51

以下是提出的问题:

我注意到&arr和arr的行为是一样的?我想知道为什么会这样?

我们有

代码语言:javascript
复制
int arr[3][10];

arr[0]是一个int[10],也就是说,一个由10个int值组成的数组。

但它被当作一个指针对待。当数组被视为指针时,它会生成指向数组的第一个元素的指针。因此,这意味着在必要时,arr[0]自动转换为指向第一行arr的第一个元素的int*

&arr[0]的意思是&(arr[0])。它生成一个int(*)[10] (指向10个int值数组的指针),指向arr的第一行。

回顾一下,

  • arr[0]是一种降解为int*int[10]

它指向arr.第一行的第一个元素

  • &arr[0]int(*)[10]

它指向arr.的第一行

因此,arr[0]与您的断言相反,并不等同于&arr[0]

这种缺乏等价性的情况,就是为什么当您拥有&arr[0]时(这意味着int (*arr)[10]是一个参数)时,您必须从arr[10]改为以int *arr作为参数时的arr[10]

票数 1
EN

Stack Overflow用户

发布于 2022-07-21 23:07:46

这两个程序都不正确。

您声明了一个二维数组

代码语言:javascript
复制
 int arr[3][10];

所以像这个arr[0]arr[1]arr[2]这样的表达式有数组类型int[10]。也就是说,它们产生二维数组的第一行、第二行和第三行。

在第一个程序中,您将调用函数Multiplication,如

代码语言:javascript
复制
Multiplication(&arr[0],2,3);
Multiplication(&arr[1],7,3);
Multiplication(&arr[2],9,3);

在函数中有两个嵌套循环

代码语言:javascript
复制
void Multiplication(int arr[][10], int num, int size){
    for(int j=0;j<size;j++){
        for(int i=0;i<10;i++){
            arr[j][i] = num * (i+1);
        }
    }
}

根据为参数size指定的参数,该函数使用指向数组第一个元素的指针处理具有数组类型int[10]的三个元素(行)的二维数组。因此,对于参数表达式&arr[1]&arr[2],可以访问原始二维数组以外的内存。

你可以考虑这些电话

代码语言:javascript
复制
Multiplication(&arr[0],2,3);
Multiplication(&arr[1],7,3);
Multiplication(&arr[2],9,3);

喜欢

代码语言:javascript
复制
Multiplication( arr, 2, 3 );
Multiplication( arr + 1, 7, 3 );
Multiplication( arr + 2, 9, 3 );

数组指示符arr被隐式转换为指向其int ( * )[10]类型的第一个元素(行)的指针。

由于您在数组中只设置了一个“行”,所以可以按照以下方式声明和定义该函数

代码语言:javascript
复制
void Multiplication(int arr[][10], int num ){
    for(int j=0;j < 10;j++){
        ( *arr )[j]= num * (j+1);
    }
}

给我打电话

代码语言:javascript
复制
Multiplication( arr, 2 );
Multiplication( arr + 1, 7 );
Multiplication( arr +2, 9 );

如果您希望设置子数组的元素,则可以按照最初定义函数的方式定义函数,但调用如下

代码语言:javascript
复制
Multiplication( arr, 2, 3 );
Multiplication( arr + 1, 7, 2 );
Multiplication( arr +2, 9, 1 );

在第二个程序中,函数声明如下

代码语言:javascript
复制
void Multiplication(int *arr, int num,int size){
        for(int i=0;i<10;i++){
            arr[i] = num * (i+1);
        }
}

你说它就像

代码语言:javascript
复制
Multiplication(arr[0],2,3);
Multiplication(arr[1],7,3);
Multiplication(arr[2],9,3);

但是在函数中不使用参数size。这里使用的是幻数10。而通过的参数3没有意义。

您应该将函数声明为

代码语言:javascript
复制
void Multiplication(int *arr, int num,int size){
        for(int i=0;i<size;i++){
            arr[i] = num * (i+1);
        }
}

把它叫做

代码语言:javascript
复制
Multiplication(arr[0],2,10);
Multiplication(arr[1],7,10);
Multiplication(arr[2],9,10);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73073168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档