Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 结构复合体(*ptr1)[4]和结构复合体*ptr1之间的差异_C - Fatal编程技术网

C 结构复合体(*ptr1)[4]和结构复合体*ptr1之间的差异

C 结构复合体(*ptr1)[4]和结构复合体*ptr1之间的差异,c,C,以下声明之间有什么区别 struct complex*ptr1=(struct complex*)malloc(4*sizeof(struct complex)) struct complex(*ptr1)[4]=(struct complex*)malloc(sizeof(struct complex)) 使用哪个更好?让我们先清理一下这些调用。C不要求您强制转换malloc的结果,这样做被认为是不好的做法(另一方面,C++确实需要强制转换,但您不应该在C++中使用malloc)。此外,还可以

以下声明之间有什么区别

  • struct complex*ptr1=(struct complex*)malloc(4*sizeof(struct complex))
  • struct complex(*ptr1)[4]=(struct complex*)malloc(sizeof(struct complex))

  • 使用哪个更好?

    让我们先清理一下这些调用。C不要求您强制转换
    malloc
    的结果,这样做被认为是不好的做法(另一方面,C++确实需要强制转换,但您不应该在C++中使用
    malloc
    )。此外,还可以将解引用的目标作为操作数传递给
    sizeof
    ,因此任何
    malloc
    调用的基本形式如下

    T *p = malloc( sizeof *p * N );
    
    这为类型为
    T
    N
    对象分配了足够的空间,并将结果指针指定给
    p
    。可以使用
    p[i]
    访问每个元素

    那么,在第一种情况下,你正在做什么

    struct complex *ptr1 = malloc( sizeof *ptr1 * 4 );
    
    这为类型为
    struct complex
    的4个对象留出了空间,每个对象都作为
    ptr1[i]
    访问。这是更简单的情况

    struct complex (*ptr1)[4] = malloc( sizeof *ptr1 );
    
    这为类型为
    struct complex[4]
    的1个对象留出了空间(即
    struct complex
    的4元素数组),并将结果指针分配给
    ptr1
    。每个元素将作为
    (*ptr1)[i]
    ptr1[0][i]
    访问。只有当您试图为结构复合体的二维数组分配空间时,才会使用此表单:

    struct complex (*p)[4] = malloc( sizeof *p * N );
    

    这为
    N
    4元素数组分配了空间,或者更简单地说是
    N
    x4数组,属于
    struct complex
    。每个元素将作为
    p[i][j]

    欢迎使用堆栈溢出。数字2是指向数组的指针。它令人困惑,难以使用,而且很少有用。实际上,您总是想要数字1。在后者中,您保留的空间太少:对于1结构复合体,而不是4结构复合体+前面提到的所有内容的数组。在第一个表达式中,我们可以使用。运算符,在第二个表达式中,我们可以使用->运算符as,1访问。int i;对于(i=0;iimag}。这是如何在内存中完成的。第二个,大小是否错误?