我正试图编写代码,以便将乘法表存储在数组中。
首先,我编写了以下代码。
#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);
}
}
}当我检查是否有红色的部分时,我取下了一些碎片。
#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的行为是一样的?我想知道为什么会这样?
发布于 2022-07-21 22:40:51
以下是提出的问题:
我注意到&arr和arr的行为是一样的?我想知道为什么会这样?
我们有
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]。
发布于 2022-07-21 23:07:46
这两个程序都不正确。
您声明了一个二维数组
int arr[3][10];所以像这个arr[0],arr[1],arr[2]这样的表达式有数组类型int[10]。也就是说,它们产生二维数组的第一行、第二行和第三行。
在第一个程序中,您将调用函数Multiplication,如
Multiplication(&arr[0],2,3);
Multiplication(&arr[1],7,3);
Multiplication(&arr[2],9,3);在函数中有两个嵌套循环
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],可以访问原始二维数组以外的内存。
你可以考虑这些电话
Multiplication(&arr[0],2,3);
Multiplication(&arr[1],7,3);
Multiplication(&arr[2],9,3);喜欢
Multiplication( arr, 2, 3 );
Multiplication( arr + 1, 7, 3 );
Multiplication( arr + 2, 9, 3 );数组指示符arr被隐式转换为指向其int ( * )[10]类型的第一个元素(行)的指针。
由于您在数组中只设置了一个“行”,所以可以按照以下方式声明和定义该函数
void Multiplication(int arr[][10], int num ){
for(int j=0;j < 10;j++){
( *arr )[j]= num * (j+1);
}
}给我打电话
Multiplication( arr, 2 );
Multiplication( arr + 1, 7 );
Multiplication( arr +2, 9 );如果您希望设置子数组的元素,则可以按照最初定义函数的方式定义函数,但调用如下
Multiplication( arr, 2, 3 );
Multiplication( arr + 1, 7, 2 );
Multiplication( arr +2, 9, 1 );在第二个程序中,函数声明如下
void Multiplication(int *arr, int num,int size){
for(int i=0;i<10;i++){
arr[i] = num * (i+1);
}
}你说它就像
Multiplication(arr[0],2,3);
Multiplication(arr[1],7,3);
Multiplication(arr[2],9,3);但是在函数中不使用参数size。这里使用的是幻数10。而通过的参数3没有意义。
您应该将函数声明为
void Multiplication(int *arr, int num,int size){
for(int i=0;i<size;i++){
arr[i] = num * (i+1);
}
}把它叫做
Multiplication(arr[0],2,10);
Multiplication(arr[1],7,10);
Multiplication(arr[2],9,10);https://stackoverflow.com/questions/73073168
复制相似问题