C 访问动态分配的元素和数组
当我们像这样分配动态数组时:C 访问动态分配的元素和数组,c,arrays,malloc,dynamic-memory-allocation,C,Arrays,Malloc,Dynamic Memory Allocation,当我们像这样分配动态数组时:MyArray*MyArray=malloc(10*sizeof(MyArray))然后我们使用点(.)操作符访问内存位置,如下所示:myArray[0].myVar,但是当我们使用单个元素myArray*myArray=malloc(sizeof(myArray));然后我们使用箭头(->)访问它的成员,如下面的myArray->myVar 在数组分配的第一种情况下,myArray=malloc(10*sizeof (myArray)),myArray[i]指向第i
MyArray*MyArray=malloc(10*sizeof(MyArray))
然后我们使用点(.)操作符访问内存位置,如下所示:myArray[0].myVar
,但是当我们使用单个元素myArray*myArray=malloc(sizeof(myArray))
;然后我们使用箭头(->)访问它的成员,如下面的myArray->myVar
在数组分配的第一种情况下,myArray=malloc(10*sizeof
(myArray)),myArray[i]指向第i个元素。所以我们也在这里
在引用其成员时应使用箭头,如
(myArray[i]->myVar)
我知道(myArray[I]->myVar)是错误的,但请从概念上解释为什么它是错误的?正如您所提到的,如果您有一个声明
typedef struct myArrays
{
int id;
}MyArray;
然后你可以写一个例子
struct A
{
int x;
} *a = malloc( sizeof( struct A ) );
struct A
{
int x;
} *a = malloc( 10 * sizeof( struct A ) );
0[a].x = 10;
或
这和
( a + 0 )->x = 10;
( *( a + 0 ) ).x = 10;
int i = 5;
( a + i )->x = 10;
( *( a + i ) ).x = 10;
或
这和
( a + 0 )->x = 10;
( *( a + 0 ) ).x = 10;
int i = 5;
( a + i )->x = 10;
( *( a + i ) ).x = 10;
您可以将指针指向单个对象,作为指向只包含一个元素的数组的第一个元素的指针。
如果你有一系列的结构,比如a[0].x = 10;
你可以写一个例子
struct A
{
int x;
} *a = malloc( sizeof( struct A ) );
struct A
{
int x;
} *a = malloc( 10 * sizeof( struct A ) );
0[a].x = 10;
这和
( a + 0 )->x = 10;
( *( a + 0 ) ).x = 10;
int i = 5;
( a + i )->x = 10;
( *( a + i ) ).x = 10;
这和
( a + 0 )->x = 10;
( *( a + 0 ) ).x = 10;
int i = 5;
( a + i )->x = 10;
( *( a + i ) ).x = 10;
带有下标运算符的后缀表达式返回指向对象的左值
来自C标准(6.5.2.1数组订阅)
2后接方括号中的表达式[]
数组对象元素的下标指定。这个
下标运算符[]的定义是E1[E2]与
(*((E1)+(E2)))。因为适用于
二进制+运算符,如果E1是数组对象(相当于指针
,E2是一个整数,
E1[E2]指定E1的第E2个元素(从零开始计数)
这样你甚至可以写作
a[i].x = 10;
比如说
struct A
{
int x;
} *a = malloc( sizeof( struct A ) );
struct A
{
int x;
} *a = malloc( 10 * sizeof( struct A ) );
0[a].x = 10;
#包括
#包括
内部主(空)
{
结构A
{
int x;
}*a=malloc(sizeof(结构a));
0[a].x=10;
printf(“a->x=%d\n”,a->x);
免费(a);
返回0;
}
我知道了原因。在数组的情况下:myArray[I]。myVar
表示*(myArray+I)。myVar
在元素情况下:myArray->myVar
也表示(*myArray)。myVar
。所以基本上我也可以用“(*myArray).myVar
”来代替myArray->myVar
。我还可以使用(myArray+I)->myVar
代替myArray[I].myVar
简言之:
myArray[i].myVar==(*(myArray+i)).myVar==(myArray+i)->myVar
及
myArray->myVar==(*myArray).myVar
因为您没有分配指针数组。myArray的定义在哪里?请给出一个完整有效的示例。我编辑了我的问题。(*X)。Y
与X[0]的意思相同。Y
由于运算符myArray[I]的优先级。myVar的意思是(*(myArray+I))。myVar就是说,您需要再使用一对括号。您甚至在末尾添加了细微差别!如果您定义h++
,那么您可以拥有一个h0[a].x
…)