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

问题描述 投票:1回答:3

我有定义为代码的自定义阵列类型和指针还定义了阵列型。我试图找到自定义数组类型和指向自定义数组类型之间的相关性。如何将值分配到自定义数组的指针类型,所以我可以通过使用指针数组迭代?

#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。

我也收到了警告:

警告:分配给 'ptr_array_type'{又名 'INT(*)[3]'}从兼容的指针类型 '诠释*'[-Wincompatible指针类型] PTR = A;

可能有人点我到一个适当的值赋给指针,所以我可以通过遍历数组的正确方法。

c arrays pointers typedef
3个回答
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微,在那里它们隐藏不相关的细节,基本上改善代码的清晰,或类似的。避免使用类型定义是模糊的有关细节,如该类型的对象指针或数组,除非,也许,这些细节都非常清楚从类型名称,或者除非它们藏是故意的,无害的。这是很少无害隐藏数组或指针的性质。


1
投票

ptrint[3]一个指针; aint[3]。虽然我不喜欢一般typedefing指针类型,如果你坚持这种方法,这里是你如何能解引用到从a ptr的第一个元素:

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

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 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 );

部分或漏抽象只是导致你的混淆使用和维护的代码。如果一个类型的用户才能使用得当,那么不要隐藏一个typedef后面这些素质不为[]和一元*提供替代品要注意该类型的“阵性”或“指针性”的运营商也是如此。还提供了一些方法来抽象出I / O - 不强迫用户必须知道是否使用%d%f%sprintf声明,如果他们不与原始类型的工作。

© www.soinside.com 2019 - 2024. All rights reserved.