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