0

如何编写这个C程序指针传递和值传递?我创建了这个程序,它从to生成一个10x10数组,主对角线从下到上读取,但我不知道如何创建另外两个通过指针和值传递的程序我必须用相同的输入再编写两个程序并且只能通过这两种方式输出。我是 C 的初学者,我不知道怎么做。-100100

#include <stdio.h>
#include <stdlib.h>

#define N 10
#define M 10

int my_rand(int max, int min)
{
    return (min + rand() / (RAND_MAX / (max - min + 1) + 1));
}

void generate_array(int(*array)[M])
{
    printf("Table:");
    for (int i = 0; i < N; i++)
    {
        printf("\n");
        for (int j = 0; j < M; j++)
        {
            array[i][j] = my_rand(-100, 100);
            printf("%4d ", array[i][j]);
        }
    }
}
void print_diagonal(int(*array)[M])
{
    printf("\n\nThe main diagonal read from bottom to top:\n");
    for (int i = N - 1; i >= 0; i--)
    {
        printf("%4d ", array[i][i]);
    }
}

int *create_array(int(*array)[M])
{
    static int new_array[M] = { 0 };
    for (int i = 0; i < N; i++)
        new_array[i] = array[i][i];
    return new_array;
}

void reverseArray(int arr[], int start, int end)
{
    int temp;
    while (start < end)
    {
        temp = arr[start];
        arr[start] = arr[end];
        arr[end] = temp;
        start++;
        end--;
    }
}

void printArray(int arr[])
{
    int i;
    for (i = N; i < N; i++)
        printf("%4d ", arr[i]);
    printf("\n");
}

int main(void)
{
    int array1[N][M] = { 0 }, *aux_array;
    generate_array(array1);
    print_diagonal(array1);
    aux_array = create_array(array1);
    reverseArray(aux_array, 0, N - 1);
    printArray(aux_array);
}

任何帮助将非常感激。

4

1 回答 1

0

C 仅支持按值传递。函数定义中的形式参数始终是内存中与函数调用中的实际参数不同的对象(假设实际参数本身就是一个对象,它不一定是)。

我们可以通过传递指针(按值传递)来伪造传递引用语义。这是一个典型的例子:

void swap( int *a, int *b )
{
  int tmp = *a;
  *a = *b;
  *b = tmp;
}

我们接收指向两个整数对象的指针,而不是接收整数对象。我们使用一元运算*符来取消引用指针并访问指向的对象。如果我们这样调用该函数:

int main( void )
{
  int x = 1;
  int y = 2;

  ...
  swap( &x, &y );
  ... 
  return 0;
}

给定上面的代码,当我们进入swap函数时,以下是正确的:

 a == &x        // int *
*a ==  x  == 1  // int

 b == &y        // int *
*b ==  y  == 2  // int

在我们执行swap函数体之后,以下是正确的:

 a == &x        // no change
*a ==  x  == 2

 b == &y        // no change
*b ==  y  == 1

当您将数组表达式作为函数参数传递时,事情变得很奇怪。C 有一个规则,当数组表达式不是单目运算符sizeof或一元运算符的操作数&,或者不是用于在声明中初始化字符数组的字符串字面量时,表达式从数组类型转换(“衰减”)为指针类型,表达式的值是第一个元素的地址。

IOW,给定代码

int arr[10];

foo( arr );

由于它不是一元运算符sizeof或一元运算&符的操作数,因此调用中的表达式 会自动从类型“10 元素数组”转换为“指针”,并且传递给 foo 的值是第一个元素的地址; IOW,该调用与写作相同arrfoointint

foo( &arr[0] );

并且函数定义将被写为

void foo( int *a ) // or int a[], which means the same thing
{
  // do something with a[i]
}

IOW,您不能在 C 中按值传递数组。

所以,看看你的代码:

int my_rand(int max, int min)

两者maxmin按值传递

void generate_array(int(*array)[M])

void print_diagonal(int(*array)[M])

它们接收指向 2D 数组第一个元素的指针,所以我们在伪造 pass-by-reference。

void reverseArray(int arr[], int start, int end)

我们正在接收指向数组第一个元素的指针(T a[]并且T a[N]都被解释为T *a函数参数声明),start并且end是按值传递的。

void printArray(int arr[])

同样,我们接收到指向数组第一个元素的指针。

于 2018-04-01T19:10:53.850 回答