簡體   English   中英

訪問動態分配的元素和數組

[英]Accessing Dynamic allocated element and array

typedef struct myArrays
{
int id;
}MyArray;

當我們這樣分配動態數組時: MyArray * myArray = malloc(10 * sizeof (myArray) ); 然后我們使用dot(。)運算符訪問內存位置,如下所示: myArray[0].myVar ,但是當我們將單個元素myArray[0].myVar MyArray * myArray = malloc( sizeof (myArray) ) 然后我們使用arrow(->)這樣的myArray->myVar訪問其成員。

在數組分配的第一種情況下,myArray = malloc(10 * sizeof(myArray)),myArray [i]指向第ith個元素。 因此,在這里我們還應該使用箭頭來引用其成員,例如(myArray [i]-> myVar)。

我知道(myArray [i]-> myVar)是錯誤的,但是請從概念上解釋為什么它是錯誤的?

如您所言,如果您有例如聲明

struct A
{
    int x;
} *a = malloc( sizeof( struct A ) ); 

那么你可以寫例如

a->x = 10;

要么

( a + 0 )->x = 10;

與...相同

( *a ).x = 10;

要么

( *( a + 0 ) ).x = 10;

它與

a[0].x = 10;

您可以將指向單個對象的指針視為僅包含一個元素的數組的第一個元素的指針。

如果您有一系列類似的結構

struct A
{
    int x;
} *a = malloc( 10 * sizeof( struct A ) ); 

你可以寫例如

int i = 5;

( a + i )->x = 10;

與...相同

( *( a + i ) ).x = 10;

它與

a[i].x = 10;

帶下標運算符的后綴表達式返回指向對象的左值。

根據C標准(6.5.2.1數組下標)

2后綴表達式和后跟方括號[]的表達式是數組對象元素的下標名稱。 下標運算符[]的定義是E1 [E2]與(*((E1)+(E2)))相同。 由於適用於二進制+運算符的轉換規則,如果E1是一個數組對象(相當於一個指向數組對象初始元素的指針),而E2是一個整數,則E1 [E2]表示E1的第E2個元素E1(從零開始計數)。

這樣你甚至可以寫

0[a].x = 10;

例如

#include <stdio.h>
#include <stdlib.h>

int main( void ) 
{
    struct A
    {
        int x;
    } *a = malloc( sizeof( struct A ) ); 

    0[a].x = 10;

    printf( "a->x = %d\n", a->x );

    free( a );

    return 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM