我在代码中定义了一个自定义数组类型,并且还定义了指向该数组类型的指针。我试图找到自定义数组类型和指向自定义数组类型的指针之间的关联。如何为自定义数组类型的指针分配一个值,以便可以使用指针遍历数组?
#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;
有人可以用正确的方式指出我,以便为指针分配一个适当的值,以便我可以遍历数组。
答案 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
他们不使用原始类型。