なぜ `&`はCでは許可されていませんが、この場合はC ++で許可されていますか?何か違いはありますか?[複製]

Nov 30 2020

これが私のCコードですが、使用しvoid InitList(List &L);ていますが、Code :: Blocksのビルドログにエラーがあります:

'&'トークンの前に ';'、 '、'、または ')'が必要です

#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10
typedef int ElementType;

struct SeqList;
typedef struct SeqList List;
void InitList(List &L);

struct SeqList
{
    ElementType *data;
    int CurLength;
};

/*----------------------------------*/

void InitList(List &L)
{
    (&L)->data = malloc(sizeof(ElementType)*MaxSize); 
    (&L)->CurLength = 0;
}


int main()
{
    List L;
    InitList(&L);
    return 0;
}

しかし、私はC ++で試しましたが、エラーはありません。

#include <iostream>
using namespace std;
#define InitSize 100
typedef int ElementType;

struct SeqList;
typedef struct SeqList List;
void InitList(List &L);

struct SeqList
{
    ElementType *data;
    int CurLength;
};


/*----------------------------------*/

void InitList(List &L)
{
    L.data = new ElementType[InitSize]; //L.data = malloc(...)
    L.CurLength = 0;
}

int main()
{
    List L;
    InitList(L);
    return 0;
}

回答

2 Monstarules Dec 01 2020 at 02:09

Cの関数宣言でそれを渡すことはできません。そのデータへのポインターを参照する場合は、*を使用する必要があります。

void InitList(List *L)
{
    L->data = malloc(sizeof(ElementType)*MaxSize); 
    L->CurLength = 0;
}

その後

List *L;
InitList (&L);
1 RemyLebeau Dec 01 2020 at 02:22

void InitList(List &L);L参照によって渡されています。Cは参照、つまりC ++機能をサポートしていません。Cでは、L代わりにポインタを渡す必要があります(これはmain()、を使用するときに実行しようとしていることですList L; InitList(&L);が、の宣言InitList()は間違っています)。例:

#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10
typedef int ElementType;

struct SeqList;
typedef struct SeqList List;
void InitList(List *L);
void CleanupList(List *L);

struct SeqList
{
    ElementType *data;
    int CurLength;
};

/*----------------------------------*/

void InitList(List *L)
{
    L->data = malloc(sizeof(ElementType)*MaxSize); 
    L->CurLength = 0;
}

void CleanupList(List *L)
{
    free(L->data); 
    L->CurLength = 0;
}

int main()
{
    List L;
    InitList(&L);
    ...
    CleanupList(&L);
    return 0;
}