我有定义为代码的自定义阵列类型和指针还定义了阵列型。我试图找到自定义数组类型和指向自定义数组类型之间的相关性。如何将值分配到自定义数组的指针类型,所以我可以通过使用指针数组迭代?
#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;
可能有人点我到一个适当的值赋给指针,所以我可以通过遍历数组的正确方法。
如何将值分配到自定义数组的指针类型,所以我可以通过使用指针数组迭代?
通过定义鉴于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微,在那里它们隐藏不相关的细节,基本上改善代码的清晰,或类似的。避免使用类型定义是模糊的有关细节,如该类型的对象指针或数组,除非,也许,这些细节都非常清楚从类型名称,或者除非它们藏是故意的,无害的。这是很少无害隐藏数组或指针的性质。
ptr
是int[3]
一个指针; a
是int[3]
。虽然我不喜欢一般typedef
ing指针类型,如果你坚持这种方法,这里是你如何能解引用到从a
ptr
的第一个元素:
ptr = &a;
printf("%d\n", **ptr);
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
或%s
在printf
声明,如果他们不与原始类型的工作。