有什么方法可以初始化没有括号的数组吗?
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
我想问一下有没有办法初始化一个不带括号的多元素数组,例如:
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