如何通过添加指针来修复C代码?

时间:2018-09-11 18:36:10

标签: c pointers

我在下面添加了我的代码。我创建了一个5x5的身份矩阵,但是我的老师希望我们使用指针/寻址方法来显示该矩阵。我不完全理解指针,并且在将其添加到代码中时遇到了麻烦。我了解如何创建矩阵,但不了解如何使用指针。任何帮助将不胜感激。

    #include<stdio.h>

int main() {

   int i;
   int j;
   int ar[i][j];//initialize the array
   int ptr;
    *ptr = ar;
   for(i = 0; i < 5; i++){
       for( j=0; j<5; j++) {

          //if i = j, the array will = 1 
         if (i == j ){          
           ar[i][j] = 1;
           printf("%d",ar[i][j]);
        } 

        //else it will equal 0
        else {
        ar[i][j] = 0;
        printf("%d",ar[i][j]);
     }
       }
   }
}

3 个答案:

答案 0 :(得分:1)

  

如何通过添加指针来修复我的C代码?

减去对Identity的函数调用的输入错误,您的代码实际上并未中断,因此“添加指针”无法解决任何问题。

  

我了解如何创建矩阵,但不能理解   使用指针。

您这么说,但实际上并没有使用发布的代码创建矩阵;您只是在打印出类似于单位矩阵的图案。

  

..我的老师希望我们使用指针/寻址方法来显示   矩阵。我不完全了解指针,而且我一直在   麻烦将其添加到我的代码中。.

如果您的老师希望您使用指针来显示矩阵,那么您将必须实际创建一个矩阵。这可以静态或动态完成。对于初学者/学生来说,静态地讲是最有意义的。您将这样:int matrix[5][5]

了解指针通常是C的新手最难理解的方面之一,因此很正常。可能以前有人对您说过,但我再说一遍:指针指向到内存位置。您可以使用该指针获取内存位置中的值(又名解引用)。

例如:

int a = 10;
int * p = &a; //p points to the memory location where a is stored

/* these print the same thing */
printf("%d\n", a);
printf("%d\n", *p); //dereferencing

这与数组和矩阵有何关系?声明数组时,该数组的名称引用数组开头的内存位置。每个连续的元素都位于距起始位置有一定偏移的位置,这意味着第n个元素位于起始地址加(n-1)。这是静态分配数组并分配该数组的各个内存位置的示例:

int a[10] = {0}; //an array of 10 signed integers that have been initialized to 0
printf("0x%x\n", a); //prints the beginning address of the array a

a[0] = 10; //assign the 0th element
printf("%d\n", a[0]); //prints 10

*a = 11; //this also assigns the 0th element
printf("%d\n", *a); //prints 11

a[1] = 12; //assign the 1st element
printf("%d\n", a[1]); //prints 12

*(a + 1) = 13; //this also assigns the 1st element
printf("%d\n", *(a + 1)); //prints 13

矩阵是一个数组数组,但是所有元素在内存中彼此相邻,因此您可以以线性方式寻址元素:beginning_address + current_row * total_number_of_columns + current_column

知道了这一点,让我们更改您的Identity函数:

int Identity(int * ptr, int num) { 
    int row, col; 

    for (row = 0; row < num; row++) { 
        for (col = 0; col < num; col++) { 
            // Check if row is equal to column  
            if (row == col) 
                *(ptr + row*num + col) = 1;
            else
                *(ptr + row*num + col) = 0; 
        }  
    } 
    return 0; 
}

现在,它需要一个指向int和单位矩阵大小的指针。要使用它,我们将向它传递一个指向矩阵开头的指针以及矩阵的大小。

赞:

int main(){

    /* this needs to match your matrix dimensions!! */
    int size = 5; 

    /* statically allocate 5 x 5 matrix of signed integers */
    int matrix[5][5] = {0};

    /* modifies our matrix to make it an identity matrix */
    Identity(&matrix[0][0], size); //first argument is the address of the element located in row 0, column 0

    /* now go through and print elements of the matrix */
    //I'm going to leave this part up to you

    return 0;

}

有关C中矩阵的更多信息,请查看此tutorial

答案 1 :(得分:-1)

#include <stdio.h>

int main(void) {
  // const
  int ROWS= 3,  COLS= 4;

  // variable
  int row, col;

  // 2d array
  int arr[ROWS][COLS];

  // fill pointer with first address of array
  int *ptr = &arr[0][0];

  // print the element of the array via pointer ptr
  for (row = 0; row < ROWS; row++) {
    for (col = 0; col < COLS; col++) {
      if(row == col) {
         *(ptr + (row*COLS + col)) = 1;
      }
      else {
         *(ptr + (row*COLS + col)) = 0;
      }
      printf("%d ", *(ptr + (row*COLS + col)));
    }
    printf("\n");
  }   
  return 0;
}

输出:

1 0 0 0                                                                                                                                
0 1 0 0                                                                                                                                
0 0 1 0 

答案 2 :(得分:-2)

任何数组在传递给函数时都会衰减为指针。通过传递适当的“大小”信息,您可以将其用作矩阵。

因此,您需要的只是下面的代码-这会将a作为指针传递给int的数组(大小为n)。然后,您可以使用简单的数组索引来取消引用指针:

#include <stdio.h>

void make_identity(int n, int a[n][n])
{
    for (int i = 0; i < n; ++i)
    {
        for (int j=0; j < n; ++j)
        {
            if (i==j)
                a[i][j]=1;
            else
                a[i][j]=0;
        }
    }
}

void print_matrix(int n, int a[n][n])
{
    for (int i = 0; i < n; ++i)
    {
        for (int j=0; j < n; ++j)
        {
            printf("%d ", a[i][j]);
        }
        printf("\n");
    }
}

int main(void) {
    int size = 5;   // Just change size to get another matrix size
    int matrix[size][size];
    make_identity(size, matrix);
    print_matrix(size, matrix);
    return 0;
}

输出:

1 0 0 0 0 
0 1 0 0 0 
0 0 1 0 0 
0 0 0 1 0 
0 0 0 0 1 

另一种编写代码的方法是:

void make_identity(int n, int (*a)[n])
{
     ...
}


void print_matrix(int n, int (*a)[n])
{
     ...
}

它会给您完全相同的结果(尽管IMO不太可读)。

在两种情况下,a都是一个指向数组(大小为n)int的指针