Mengapa `&` tidak diizinkan di C, tetapi di C ++ dalam kasus ini? Apakah ada perbedaan? [duplikat]
Nov 30 2020
Ini adalah kode C saya, saya menggunakan void InitList(List &L);
Namun Code :: Blocks`s buildlog mengalami error:
diharapkan ';', ',' atau ')' sebelum '&' token
#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;
}
Tetapi saya mencoba di C ++, tidak ada kesalahan:
#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;
}
Jawaban
2 Monstarules Dec 01 2020 at 02:09
Anda tidak bisa meneruskannya dalam deklarasi fungsi di C. Anda harus menggunakan * jika ingin mereferensikan pointer ke data tersebut.
void InitList(List *L)
{
L->data = malloc(sizeof(ElementType)*MaxSize);
L->CurLength = 0;
}
Lalu
List *L;
InitList (&L);
1 RemyLebeau Dec 01 2020 at 02:22
Dalam void InitList(List &L);
, L
sedang diteruskan dengan referensi . C tidak mendukung referensi, itu adalah fitur C ++. Di C, Anda perlu melewati L
pointer sebagai gantinya (yang persis seperti yang Anda main()
coba lakukan saat menggunakan List L; InitList(&L);
, tetapi deklarasi InitList()
salah untuk itu), misalnya:
#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;
}
Kiat Pemilik Anjing yang Bermanfaat: Mengapa Penting untuk Membiarkan Anjing Anda Mengendus di Jalan
Taylor Sheridan Baru Menambahkan 1 Bintang 'Yellowstone' Favoritnya ke Pemeran 'Lawmen: Bass Reeves'