指针数组的初始化

3
我了解到数组的名称实际上是array_name[0]的地址。那么为什么在初始化指向数组的指针时需要在数组名称前添加&符号?
  int (*pointer_name)[5] = &array_name;

我尝试过:

  int *pointer_name = array_name; 

它能正常工作。除了“指针类型”之外,它们之间有什么区别?它们各自的优缺点是什么?何时使用它们?它们中是否有任何一个比另一个功能更强大/更好?


我已经学到了数组的名称实际上是array_name[0]的地址。你的学习有误。在某些情况下,数组名称可以充当指向array_name[0]的指针,但并非所有情况都是如此。而且你绝对不能说数组的名称就是array_name[0]的地址。 - AnT stands with Russia
3个回答

3
int *pointer_name = array_name;

声明一个指向数组array_name的第一个int的指针。
int (*pointer_name)[5] = &array_name;

声明了一个指向包含5个int的数组的指针,该指针指向数组array_name

地址相同但类型不同。

如果在这些上使用指针算术运算:

pointer_name++;

第一种情况只会指向数组的第二个int,而在第二种情况中,它将指向整个数组之后。


2
那么为什么需要添加“&”符号[...]呢?我尝试过:int *pointer_name = array_name; 这也可以正常工作。
因为它们的类型不同。
  • &array_name是指向5个整数数组的指针,类型为:int (*)[5]

  • 当你将array_name赋值给pointer_name(相当于&array_name[0])时,它会被转换为其第一个元素的指针,类型为:int*

如果array_name是由5个整数组成的数组,则:

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

并且

int *pointer_name = array_name;

这两个指针都是有效的。只是后续通过这两个指针访问它们的方式不同。


我已经检查过了。两种指针的大小都为8字节。它们存储的值也相同。它们在功能上有什么区别?它们是否相同? - Shaw Ankush
地址将是相同的(&array_name == &array_name[0] == array_name)。但是,您可以访问该数组的方式不同。 使用 int *pointer_name = array_name;,您可以像这样访问它:pointer_name[0] /*array_name[0] */*pointer_name /*array_name[0] */; *(pointer_name + 1) /* array_name[1] */。 使用 int (*pointer_name)[5] = &array_name;,您可以像这样访问它:(*pointer_name)[1]; /* array_name[1] */。两种方法都可以。但主要区别在于这些类型上指针算术运算的工作方式。 - P.P

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


在上面的代码片段的第二行,没有使用“&”符号的人是谁? 为什么这里不需要地址运算符?还有,某些人在评论中提到,“你绝对不能说数组的名称是array_name[0]的地址”,为什么呢? - Shaw Ankush
@ShawAnkush,我不明白你的问题。如果你指的是这段代码 int array_name[2][5];int (*pointer_name)[5] = array_name; 那么就不需要使用 & 符号。 - Vlad from Moscow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接