指向数组类型(自定义类型)的指针

时间:2019-02-04 16:35:50

标签: c arrays pointers typedef

我在代码中定义了一个自定义数组类型,并且还定义了指向该数组类型的指针。我试图找到自定义数组类型和指向自定义数组类型的指针之间的关联。如何为自定义数组类型的指针分配一个值,以便可以使用指针遍历数组?

#include<stdio.h>

typedef int array_type[3];
typedef array_type* ptr_array_type;

int main() {
   array_type a = {2,3,4};
   ptr_array_type ptr;

   ptr = a;

   printf("%d\n",*ptr);

}

我知道数组名称包含指向第一个元素的指针。我不断收到无效的打印输出: -50204788而不是2。

我也收到警告:

警告:从不兼容的指针类型'int *'分配给'ptr_array_type'{aka'int(*)[3]'}} [-Wincompatible-pointer-types]     ptr = a;

有人可以用正确的方式指出我,以便为指针分配一个适当的值,以便我可以遍历数组。

3 个答案:

答案 0 :(得分:2)

  

如何为自定义数组类型的指针分配一个值,所以我   可以使用指针遍历数组吗?

给出array_type

定义
typedef int array_type[3];

,可以将array_type分配给的指针类型为int *

typedef int *ptr_array_element;

您可以(貌似)将array_type的对象分配给类型为ptr_array_element的指针:

array_type a = {2, 3, 4};
ptr_array_element p = a;

这样做后,您可以通过derferencing运算符访问第一个数组元素。

assert(*p == 2);

您通常可以像使用C ++迭代器一样使用它:

printf("%d\n", *p++);
printf("%d\n", *p++);
printf("%d\n", *p++);

但不要。

谨慎使用typedef,在它们隐藏无关的细节,显着提高代码清晰度或类似条件的地方。避免使用遮盖相关细节的typedef,例如,该类型的对象是指针或数组,除非有可能从类型名称中清除这些细节,或者除非有意无害地隐藏它们。隐藏数组或指针的性质很少是无害的。

答案 1 :(得分:1)

resultCellArray = cell(numofruns); for i = 1:numofruns % run simulation here resultCellArray{i} = simout; end 是指向ptr的指针; int[3] 一个a。尽管我一般不喜欢int[3]指针类型,但是如果您坚持使用这种方法,则可以通过以下方法从typedef解引用到a的第一个元素:

ptr

答案 2 :(得分:0)

ptr_array_type的别名int (*)[3],而不是int *-您将无法使用它来迭代array_type。您可以使用它来遍历array_type数组,如下所示:

array_type arr[3];
ptr_array_type ptr = arr;

while ( size_t i = 0; i < 3; i++ )
  do_something_with( ptr[i] );

如果您希望能够使用指针遍历T的数组,则该指针的类型必须为T *。因此,您需要将typedef更改为类似的

typedef int array_type[3];    // probably want to replace int with another
typedef int *ptr_array_type;  // typedef to abstract out the type
...
array_type a = {1, 2, 3}; // yuck! don't do this! a is not obviously an array,
                          // so an array initializer looks wrong in this context
ptr_my_type p = a;

printf( "%d", *p );

但是...

如果您使用typedef来抽象出某种类型的实现细节,则应该抽象出该类型的所有实现细节,包括解引用和下标之类的东西。您将要创建一个完整的API,例如:

 array_type *arr = new_array_type( 1, 2, 3 );  // even this is leaky since it assumes we know
                                               // the array element type is integral
 array_type_iterator *itr = new_array_type_iterator( arr );
 array_element_type target;

 begin_iterator( &itr ); 
 while( next_iterator( &itr ) )
 {
   get_data_from_iterator( itr, &target );
   write_array_element_to( stdout, target );
 }

 free_array_type_iterator( itr );
 free_array_type( arr );

部分或泄漏的抽象只会导致代码的使用和维护混乱。如果类型的用户必须知道该类型的“数组性”或“指针性”以正确使用它,则不要在没有提供{{1}的替代品的情况下,将这些质量隐藏在typedef后面。 }和一元[]运算符。还提供抽象I / O的方法-如果发生以下情况,则不必强迫用户必须在*语句中使用%d还是%f%s他们不使用原始类型。