求解一个关于C的二维数组指定初始化问题

为什么声明一个如int a[5][5]数组之后,对其初始化a[2][3]=5不可以,书上有说需要在开头声明并用一种形式初始化,但是为什么指针形式的
(*(a+2)+5)=5却可以呢,
#include
void copy(int(*ac)[8], int(*ar)[8], int c, int d, int a);
int main(void)
{
int c, i;
int copyc[3][8];
int num[3][8] = {
{ 3, 4, 5, 6, 7, 8, 9, 1 },
{ 3, 4, 5, 6, 7, 8, 9, 1 },
{ 3, 4, 5, 6, 7, 8, 9, 1 }
};

copy(copyc, num, 2, 3, 3);
for (i = 0; i < 3; i++) {
    for (c = 0; c < 8; c++)
        printf(" %d", *(*(copyc + i) + c));
    printf("\n");
}
getchar();
return 0;

}
void copy(int (*ac)[8], int(*ar)[8], int d, int c, int a)
{
int n;

for (n = 0; n <a; n++)
{
    *(*(ac + d) + c +n-1) = *(*(ac + d) + c+n-1);
}

}

摘自:https://zhidao.baidu.com/question/252130759.html

例如对整型二维数组a[3][2]赋值
方法一:
在定义的同时赋值
int a[3][2]={0};//所有数组元素均为0
方法二:
int a[3][2]={1,2,3,4,5,6};//常规的赋值方法
方法三:
int a[3][2]={{1,2},{3,4},{5,6}};//分行的赋值方法
方法四:
int a[3][2]={{1,2},{0},{3}};//部分赋值方法,第一行元素的值分别为1,2,第二行元素值都是0,
第三行第一个元素值为3,第二个元素值为0
方法五:
int a[3][2];/先定义
for(i=0;i<=3;i++) //用双重for循环赋值,i,j表示二维数组下标
for(j=0;j<=2;j++)
scanf("%d",&a[i][j]);
希望对你有所帮助。

a[2][3]=5可以啊

http://ideone.com/xdqrzO
在线编译验证通过