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;
是指向5个整数的数组的指针,其类型为:&array\u name
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]=数组名称;那么就不需要符号了。