有什么方法可以初始化没有括号的数组吗?

Is there any way to initialize an array without brackets?

我想问一下有没有办法初始化一个不带括号的多元素数组,例如:

int a[5] = {1,2,3,4,5};

因为 *(a + 5) 等于 a[5] ,为什么我不能初始化:

int *(a + 5) = {1,2,3,4,5};

它给了我错误:在'+'令牌之前应为')'。

这个

int *(a + 5) = {1,2,3,4,5};

just 是一个无效的声明,因为在括号中使用了表达式 ( a + 5 ) 和一个名为 a 的实体,该实体未被声明。

不使用方括号你可以这样写

typedef int T[5];

T a = { 1, 2, 3, 4, 5 };

至于这个你的说法

Since *(a + 5) equals with a[5] , why i cannot initialize with:

那么在此上下文中 *( a + 5 ) 不是数组。它是一个产生元素 a[5] 的表达式,前提是 a 已经被声明为元素数量不少于 6 的数组。否则 a[5] 将是数组 a.

中不存在的元素

E1[E2]*(E1 + E2) 的等价性仅适用于 表达式 。您拥有的是一个 声明,它具有不同的语法规则。

所以你需要使用这个语法:

int a[5] = {1,2,3,4,5};

你可以这样试试:

int *arr=(int*)malloc(5*sizeof(int));
for(int i=0;i<5;i++) {
    scanf("%d",&(*(arr+i)));
}    
or
int *arr=(int*)malloc(5*sizeof(int));
*(arr+0)=1;
*(arr+1)=2;
*(arr+2)=3;
*(arr+3)=4;
*(arr+4)=5;

*(a + 5) 替换 a[5] 在声明或定义中不起作用。

如果你真的想避免使用方括号(我假设是为了赢得赌注),这里有 2 个扭曲但符合标准的解决方案:

使用三字母:int a??(5??) = {1,2,3,4,5};

使用二合字母:int a<:5:> = {1,2,3,4,5};

可以在 Digraphs and Trigraphs 中找到更多信息。

您甚至可以编写一个片段,该片段将在禁用三字母但支持二字母的最新编译器上编译:

// trick: the comment spans to the next line if trigraphs are enabled
#define TRIGRAPHS_DISABLED  1 //??/
-1

#if TRIGRAPHS_DISABLED
int a<:5:> = {1,2,3,4,5};
#else
int a??(5??) = {1,2,3,4,5};
#endif