C 关于整数三指针和浮点三指针区别的问题

C 关于整数三指针和浮点三指针区别的问题,c,arrays,pointers,matrix,integer,C,Arrays,Pointers,Matrix,Integer,我在学校做一个项目,他们强迫我们在两个矩阵相乘的函数中使用浮点型三指针, 最后一天,我不明白为什么当我使用int三指针时,我得到了所需的数字,但当我使用float时,我得到了零。 我为这个问题写了一些简单的例子。 谢谢 int ***ptr3; int Matrix[3][3] = { {1,2,3},{4,5,6},{7,8,9} }; int i; ptr3 = malloc(sizeof(int)); ptr3 = Matrix; for

我在学校做一个项目,他们强迫我们在两个矩阵相乘的函数中使用浮点型三指针, 最后一天,我不明白为什么当我使用int三指针时,我得到了所需的数字,但当我使用float时,我得到了零。 我为这个问题写了一些简单的例子。 谢谢

    int ***ptr3;
    int Matrix[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
    int i;

    ptr3 = malloc(sizeof(int));
    ptr3 = Matrix;
    for (i = 0; i < 9; i++) {printf_s("%d ", ptr3[i]);}


    printf_s("\n");


    float ***ptr3_f;
    float Matrix_f[3][3] = { {1,2,3},{4,5,6},{7,8,9} };

    ptr3_f = malloc(sizeof(float));
    ptr3_f = Matrix_f;
    for (i = 0; i < 9; i++) {printf_s("%.1f ", ptr3_f[i]);}

int***ptr3;
int矩阵[3][3]={{1,2,3},{4,5,6},{7,8,9};
int i;
ptr3=malloc(sizeof(int));
ptr3=矩阵;
对于(i=0;i<9;i++){printf_s(“%d”,ptr3[i])}而言
打印文件(“\n”);
浮点数***ptr3\u f;
浮点矩阵_f[3][3]={{1,2,3},{4,5,6},{7,8,9};
ptr3_f=malloc(sizeof(float));
ptr3_f=矩阵_f;
对于(i=0;i<9;i++){printf_s(“%.1f”,ptr3_f[i])}而言

编译代码时是否看到警告:

警告:来自不兼容指针类型[-Wincompatible指针类型]的分配

警告:格式“%d”要求参数类型为“int”,但参数2的类型为“int**”[-Wformat=]
来自不兼容指针类型[-Wincompatible指针类型]的赋值

警告:格式“%f”要求参数类型为“double”,但参数2的类型为“float**”[-Wformat=]

您可以执行以下操作:

ptr3 = malloc(sizeof(int**)); // allocate the memory for storing one double pointer
*ptr3 = malloc(sizeof(int*)); // allocate the memory for storing one single pointer
**ptr3 = Matrix[0]; // point to first row of the matrix

// it's similar to float pointer type
ptr3_f = malloc(sizeof(float**)); 
*ptr3_f = malloc(sizeof(float*)); 
**ptr3_f = Matrix_f[0];
然后,当您要打印时:

for (i = 0; i < 9; i++) {printf("%d ", (**ptr3)[i]);}
for (i = 0; i < 9; i++) {printf("%.1f ", (**ptr3_f)[i]);}
(i=0;i<9;i++){printf(“%d”,(**ptr3)[i]);}的

对于(i=0;i<9;i++){printf(“%.1f”,(**ptr3_f)[i])}而言

这样的数组不需要三个指针

与:


这里有很多误解,不幸的是你的老师似乎对C不太了解。您不能简单地使用
类型***
,使用这两种类型都没有任何意义

  • ***类型的指针不能指向
    类型的3D数组。它也不能指向二维阵列。它根本不能指向任何数组类型

    有时在使用动态内存分配时,我们会分配一个
    类型*
    的数组,每个数组都指向数组中的第一项。然后可以使用
    类型**
    指向第一个
    类型*
    元素,以模拟具有
    [i][j]
    访问权限的二维数组的语法

    然而,这并不能神奇地使
    type*
    数组同时成为
    type[]
    数组。它也不会神奇地使
    type**
    成为数组
    type[][]
    。如果有人教你这一点,他们会感到困惑

    大多数情况下,我们首先不应该使用
    type**
    来模拟2D数组,因为这样做效率极低。看

  • 因此,当您尝试
    ptr3=矩阵时,编译器将出现C语言约束冲突错误。一些lax编译器“仅”给您一个警告,但这并不能使代码有效C。
    类型***
    不能用于指向3D数组,句点

    如果您在某些场景中以某种方式获得了正确的输出,那是幸运的,因为代码的行为没有得到很好的定义。在某些系统上,
    int
    恰好与指针大小相同

  • ptr3=malloc(sizeof(int));ptr3=…
    毫无意义,因为使用malloc实现的只是内存泄漏。因为您要做的第一件事是覆盖您刚才分配的数据的指针地址。我不确定您为什么要首先分配一个
    int

除去所有的误解,您或许可以通过以下方式挽救程序:

#include <stdio.h>
#include <stdlib.h>

int main (void)
{

  int (*iptr)[3];
  int imatrix[3][3] = { {1,2,3},{4,5,6},{7,8,9} };

  iptr = imatrix;
  for (int i=0; i<3; i++)
  { 
    for (int j=0; j<3; j++)
    {
      printf_s("%d ", iptr[i][j]);
    }
    printf("\n");
  }

  printf("\n");

  float (*fptr)[3];
  float fmatrix [3][3] = { {1.0f,2.0f,3.0f},{4.0f,5.0f,6.0f},{7.0f,8.0f,9.0f} };

  fptr = fmatrix;
  for (int i=0; i<3; i++)
  { 
    for (int j=0; j<3; j++)
    {
      printf_s("%.1f ", fptr[i][j]);
    }
    printf("\n");
  }
}
#包括
#包括
内部主(空)
{
int(*iptr)[3];
int imatrix[3][3]={{1,2,3},{4,5,6},{7,8,9};
iptr=imatrix;

对于(int i=0;iWell,也可以不使用指针来实现):D OP有这样一个条件:“我正在为学校做一个项目,他们强迫我们在两个矩阵相乘的函数中使用浮点型三指针”@P0W我没有注意。很抱歉,这一切指针有什么用?那只是混淆。他们已经静态分配了数组。你告诉他们坚持“三星编程”对操作没有任何好处pattern…@Lundin实际上,我们可以使用单个指针或指向数组的指针作为答案,但OP必须使用三指针(
他们强制我们使用类型float三指针
),所以我只提出一种三指针的方法,他的代码可以工作。@Hitokiri所以如果你的木工老师强迫你建造一个木屋,但递给你一个腐烂的香蕉而不是锤子,你应该继续建造它。即使很明显你的老师自己在整个职业生涯中从未建造过木屋?请分享通过与老师的链接,他们也需要学习这些东西。你能给出一个编译器版本和编译器标志,表明这是无效的指针转换吗?我不能使用gcc 7.5.0和“-Wall-pedantic-std=c11`我不能,因为代码错误,你用cast使编译器静音,这意味着“嘘,我(不)知道我在这里做什么”。您可以使用该指针执行
ptr3_i=&Matrix[0][0];
,但严格来说,我不认为使用该指针在第一个
int[3]
数组之外进行迭代是定义良好的。也就是说,C语言允许从任何对象指针到另一个对象指针的任何显式指针转换(C11关于指针转换的第6.3.2.3章)。只有在运行时通过不同类型的指针取消引用指针时,才会出现问题。然后,所有形式的错误都会爆发,例如无效转换信号、指令陷阱、未对齐、别名冲突等。编译器无法帮助您处理运行时错误。在执行此代码时,操作系统可以自由给出SIGSEGVe、 就C而言,一个特定的操作系统实际上做的是另一回事。
ptr3_i:1 2 3 4 5 6 7 8 9 
ptr3_f:1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 
#include <stdio.h>
#include <stdlib.h>

int main (void)
{

  int (*iptr)[3];
  int imatrix[3][3] = { {1,2,3},{4,5,6},{7,8,9} };

  iptr = imatrix;
  for (int i=0; i<3; i++)
  { 
    for (int j=0; j<3; j++)
    {
      printf_s("%d ", iptr[i][j]);
    }
    printf("\n");
  }

  printf("\n");

  float (*fptr)[3];
  float fmatrix [3][3] = { {1.0f,2.0f,3.0f},{4.0f,5.0f,6.0f},{7.0f,8.0f,9.0f} };

  fptr = fmatrix;
  for (int i=0; i<3; i++)
  { 
    for (int j=0; j<3; j++)
    {
      printf_s("%.1f ", fptr[i][j]);
    }
    printf("\n");
  }
}