我了解到数组的名称实际上是/usr/bin
的地址。那么为什么在初始化指向数组的指针时需要在数组名称之前添加&符号。
array_name[0]
我试过了:
int (*pointer_name)[5] = &array_name;
它工作正常。除了“指针类型”之外,两者之间有什么区别? 而且其中任何一个的优缺点是什么?什么时候使用它们? 他们中的任何人都有比其他人更好/更好的功能吗?
答案 0 :(得分:3)
int *pointer_name = array_name;
声明指向int
的指针,该指针指向数组int
的第一个array_name
。
int (*pointer_name)[5] = &array_name;
声明一个指向5 int
个数组的指针,指向数组array_name
。
地址相同但不是类型。
如果对你拥有的那些使用指针算术,在第一种情况下:
pointer_name++;
将仅指向数组的第二个int
,而在第二种情况下则指向它
将指向整个阵列之后。
答案 1 :(得分:2)
那为什么需要添加&符号[..]。我试过了:int * pointer_name = array_name;它工作正常。
因为类型不同。
&array_name
是指向5个整数数组的指针,其类型为:int (*)[5]
。
array_name
分配给pointer_name
(相当于&array_name[0]
)并且类型为int*
时, array_name
会转换为指向其第一个元素的指针
如果int (*pointer_name)[5] = &array_name;
是一个包含5个整数的数组,那么两个:
int *pointer_name = array_name;
和
.pop()
有效。通过这两个指针稍后你如何访问它们是不同的。
答案 2 :(得分:0)
指针所指向的对象类型,如
int (*pointer_name)[5] = &array_name;
是int[5]
。这意味着例如该运算符
sizeof( *pointer_name )
产生的值等于5 * sizeof( int )
。如果要使用指针算法,例如pointer_name + 1
,那么此表达式获得的地址将等于存储在指针中的地址加上5 * sizeof( int )
的值。
指针所指向的对象类型,如
int *pointer_name = array_name;
是int
。这意味着例如该运算符
sizeof( *pointer_name )
产生的值等于sizeof( int )
。如果要使用指针算法,例如pointer_name + 1
,那么此表达式获得的地址将等于存储在指针中的地址加上sizeof( int )
的值。
像这样声明的指针
int (*pointer_name)[5];
通常用于指向数组“行”的二维数组。
例如
int array_name[2][5];
int (*pointer_name)[5] = array_name;
// outputs 20 provided that sizeof( int ) is equal to 4
printf( "%zu\n", sizeof( *pointer_name ) );
// outputs 4 provided that sizeof( int ) is equal to 4
printf( "%zu\n", sizeof( **pointer_name ) );
pointer_name
指向数组array_name
的第一行。 pointer_name + 1
指向数组的第二行。