C 数组指针的初始化

C 数组指针的初始化,c,C,我了解到数组的名称实际上是array\u name[0]的地址。那么,在初始化指向数组的指针时,为什么需要在数组名称之前添加符号呢 int (*pointer_name)[5] = &array_name; 我试过: int *pointer_name = array_name; 而且效果很好。除了“指针类型”之外,这两者之间的区别是什么? 还有,它们的优点和缺点是什么。什么时候使用它们? 他们中是否有人比其他人拥有更强大/更好的功能 那么为什么需要添加符号[…]呢。我尝试

我了解到数组的名称实际上是
array\u name[0]
的地址。那么,在初始化指向数组的指针时,为什么需要在数组名称之前添加符号呢

  int (*pointer_name)[5] = &array_name;
我试过:

  int *pointer_name = array_name; 
而且效果很好。除了“指针类型”之外,这两者之间的区别是什么? 还有,它们的优点和缺点是什么。什么时候使用它们? 他们中是否有人比其他人拥有更强大/更好的功能

那么为什么需要添加符号[…]呢。我尝试过:int*pointer\u name=array\u name;而且效果很好

因为类型不同

int *pointer_name = array_name;
  • &array\u name
    是指向5个整数的数组的指针,其类型为:
    int(*)[5]

  • 数组\u名称
    指定给
    指针\u名称
    (相当于
    数组\u名称[0]
    )时,它将转换为指向其第一个元素的指针,类型为:
    int*

如果
array\u name
是一个包含5个整数的数组,则两者都是:

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

是有效的。稍后如何通过这两个指针访问它们是不同的

int *pointer_name = array_name;
声明指向
int
的指针,该指针指向数组
array\u name
的第一个
int

int (*pointer_name)[5] = &array_name;
声明一个指向数组的指针,该数组由5个
int
s组成,指向数组
array\u name

int (*pointer_name)[5] = &array_name;
地址相同,但类型不同

在第一种情况下,如果对现有的指针使用指针算法:

pointer_name++;
将只指向数组的第二个
int
,而在第二种情况下
将指向整个数组的后面。

声明为like的指针指向的对象类型

int (*pointer_name)[5] = &array_name;
int *pointer_name = array_name;
int[5]
。例如,这意味着该运算符

sizeof( *pointer_name ) 
sizeof( *pointer_name ) 
产生的值等于
5*sizeof(int)
。如果使用指针算法,例如
pointer\u name+1
,则通过该表达式获得的地址将等于存储在指针中的地址加上
5*sizeof(int)
的值


由声明为like的指针指向的对象的类型

int (*pointer_name)[5] = &array_name;
int *pointer_name = array_name;
int
。例如,这意味着该运算符

sizeof( *pointer_name ) 
sizeof( *pointer_name ) 
生成等于
sizeof(int)
的值。如果使用指针算法,例如
pointer\u 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\u name
指向数组的第一行
array\u name
指针\u name+1
指向数组的第二行。

“我知道数组的名称实际上是数组\u name[0]的地址。”。你学错了。在某些上下文中,数组名称可以充当(假装)指向
数组\u name[0]
的指针,但不是在所有上下文中。您绝对不能说数组的名称是
数组的地址\u name[0]
。我已经检查过了。这两种指针的大小都为8字节。它们存储的值也是相同的。两者的区别是什么。它们在功能上是否相同?地址将相同(
&array\u name==&array\u name[0]==array\u name
)。但访问该阵列的方式有所不同。使用
int*指针\u名称=数组\u名称
,您可以像这样访问它:
pointer\u name[0]/*array\u name[0]*/
*pointer\u name/*array\u name[0]*/*(指针\名称+1)/*数组\名称[1]*/
。使用
int(*指针名称)[5]=&数组名称
,您可以像这样访问它:
(*指针_名称)[1];/*数组名称[1]*/
。两种方法都可以。但最主要的区别在于指针算法在这些类型上的工作方式。在代码段的第二行,在上面的代码段中,谁没有在“array_name”之前使用过符号。为什么这里不需要地址运算符。还有人在评论中提到“你绝对不能说数组的名称是数组的地址”\u name[0],“为什么会这样?@ShawAnkush我不明白你在问什么。如果您指的是这个代码段int array_name[2][5];int(*指针名称)[5]=数组名称;那么就不需要符号了。