【问题标题】:Why is my pointer giving back value at address directly?为什么我的指针直接在地址返回值?
【发布时间】:2015-02-25 23:02:33
【问题描述】:

这是我的代码:

typedef struct {
    int** matrix;
    int rows;
    int cols;
}intMat;
intMat create_intMat(int rows,int cols,int matrix[rows][cols]){
        intMat A;
        A.rows = rows;
        A.cols = cols;
        int** mat;
        mat = malloc(A.rows*sizeof(int*)); // Pointer for matrix rows
        for(int i=0;i<A.rows;i++) mat[i] = malloc(A.cols*sizeof(int)); // Pointer of each matrix row to a matrix column
        for (int i=0;i<A.rows;i++){
            for (int j=0;j<A.cols;j++){
                mat[i][j]=matrix[i][j];
            }
        }
        A.matrix = mat;
        return A;
}
int main() {

        int mat[2][2] = {{1,2},{3,4}};
        intMat A;
        A = create_intMat(2,2,mat);

        printf("%d\n",A.matrix[1][1]);

        return 0;
}

我是指针的初学者,并从另一个论坛获得了代码的指针部分。不过,我不明白。 int** mat 是一个指向 int 的指针,所以如果我按原样调用它,那么它应该给我返回乱码地址,而不是指向的 int。但是,printf 语句返回 4,这是所指向的 int 的值!这是怎么回事?

【问题讨论】:

  • 实际上,您通过使用 [] 运算符将其取消引用两次。请记住,a[b]定义 等同于*(a+b),因此当您编写mat[1][1] 时,您正在执行*(*(mat+1)+1),正如您所看到的,它取消引用mat 两次,得到从int **int
  • @MatteoItalia -- 您应该考虑将其发布为答案而不是评论。

标签: c pointers


【解决方案1】:

A.matrix 是一个指向 2 个指针的指针,每个指针指向 2 个整数。
A.matrix[1] 获取这些指针中的第二个 - 指向 2 个整数的指针。
A.matrix[1][1] 获取第二个那些整数。

【讨论】:

  • 感谢您的回答!
【解决方案2】:

使用时:

int i;
int* p = &i;

int* p = malloc(sizeof(int));

p 指向一个整数。

使用时:

int array[10];
int *p = array;

int *p = malloc(sizeof(int)*10);

p 指向一个由 10 个整数组成的数组。

类似地,变量声明为:

int** mat;

可以指向一个int*int*s 的数组。

在你的例子中,mat 指向一个由 2 个int* 组成的数组,每个数组都指向一个由 2 个ints 组成的数组。

这利用了mat[1][1] 完全有效的代码。

【讨论】:

  • 在您的代码int *p = array; 中不应该是int *p = &amp;array; 吗?并感谢您的解释!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-02
  • 1970-01-01
  • 1970-01-01
  • 2020-09-09
相关资源
最近更新 更多