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



我在下面添加了我的代码。我创建了一个 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]);
}
}
}
}

如何通过添加指针来修复我的 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("%dn", a);
printf("%dn", *p); //dereferencing

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

int a[10] = {0}; //an array of 10 signed integers that have been initialized to 0
printf("0x%xn", a); //prints the beginning address of the array a
a[0] = 10; //assign the 0th element
printf("%dn", a[0]); //prints 10
*a = 11; //this also assigns the 0th element
printf("%dn", *a); //prints 11
a[1] = 12; //assign the 1st element
printf("%dn", a[1]); //prints 12
*(a + 1) = 13; //this also assigns the 1st element
printf("%dn", *(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 语言矩阵的更多信息,请查看本教程

#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 

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

所以你所需要的只是下面的代码 - 这将传递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都是指向 int 数组(大小 n(的指针

相关内容

最新更新