指向数组的指针初始化

时间:2016-11-15 18:19:08

标签: c

我了解到数组的名称实际上是/usr/bin的地址。那么为什么在初始化指向数组的指针时需要在数组名称之前添加&符号。

array_name[0]

我试过了:

  int (*pointer_name)[5] = &array_name;

它工作正常。除了“指针类型”之外,两者之间有什么区别? 而且其中任何一个的优缺点是什么?什么时候使用它们? 他们中的任何人都有比其他人更好/更好的功能吗?

3 个答案:

答案 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指向数组的第二行。