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
…)