Как я могу исправить свой код C, добавив указатели? - PullRequest
0 голосов
/ 11 сентября 2018

Я добавил свой код ниже.Я создал матрицу идентичности 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 голосов
/ 12 сентября 2018

Как я могу исправить свой код на 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

Матрица - это массив массивов, но все элементы находятся в памяти рядом друг с другом, поэтому вы можете обращаться к элементамлинейным образом: начальный_адрес + 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, посмотрите этот учебник

0 голосов
/ 13 сентября 2018
#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 
0 голосов
/ 11 сентября 2018

Любой массив превращается в указатель при передаче в функцию. Передавая подходящую информацию о размере, вы можете использовать ее в качестве матрицы.

Таким образом, все, что вам нужно, это код ниже - он передаст a как указатель в массив (размер n) из int. Затем вы можете разыменовать указатель, используя простую индексацию массива:

#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) целого числа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...