c语言二维数组
发布网友
发布时间:2022-04-23 02:13
我来回答
共5个回答
热心网友
时间:2023-10-11 01:11
这个就是指针数组和数组指针的区别了,我当年也在这里转了很久,希望我下面所说得可以帮到你。
首先,明确编译器是怎么识别*s[]和(*s)[]两种形式的代码的。对于*s[],编译器会以默认的右结合的方式进行识别,所以首先识别s[],这是一个数组,然后再识别*,说明这个数组的元素都是指针。所以最后的结果就是:这是一个“以指针为元素的数组”,简称指针数组。而对于(*s)[],由于()的优先级高于*,所以编译器会先识别()里面的,也就是先识别*s,所以它是一个指针,然后()说明这个指针指向的是一个数组,所以最后的结果是:这是一个“指向数组的指针”,简称数组指针。
好吧,我承认一点,就是这两个东西看起来复杂,但是其实用起来区别不大,最本质的东西就是,指针数组用到多个指针,数组指针就完全是一个指针跑天下。
看下面一段代码(我偷懒用C++写的,反正这个不是重点):
#include
using
namespace
std;
int
main()
{
//指针数组
*a[2]
int
t1[3]
=
{0,1,2};
int
t2[3]
=
{3,4,5};
int
t3[3]
=
{6,7,8};
int
*a[3];
a[0]
=
t1;
//一个指针赋值
a[1]
=
t2;
//第二个指针赋值
a[2]
=
t3;
//第三个指针赋值
//数组指针
(*b)[3]
int
(*b)[3]
=
new
int[3][3];
for(int
i=0;i<3;i++)
for(int
j=0;j<3;j++)
*(*(b+i)+j)
=
i*3+j;
//一个指针跑天下
cout
<<
*((*b)+1)
<<
"
"
<<
*(*(b+1))
<<
endl;
system("pause");
return
0;
}
最后我想说,其实这个做题的时候有用,自己写的时候还是尽量直接用int[n][m]的方式比较方便,稍微浪费点空间问题不大,重要的是看起来好看,不容易出错。
热心网友
时间:2023-10-11 01:11
int a[m][n];//就表示一个m行n列的整型二维数组
在c语言中数组的下标是从0开始的所以,数组a的元素个数可以表示为:a[0][0]-a[m-1][n-1]
例如:
#include<stdio.h>
int main()
{
int a[3][2],i,j;//定义一个3行2列的整型二维数组a
for(i=0;i<3;i++)//依次给二维数组赋值
for(j=0;j<2;j++)
scanf("%d",&a[i][j]);
printf("\n");
for(i=0;i<3;i++){//输出二维数组
for(j=0;j<2;j++)
printf("%d ",a[i][j]);
printf("\n");
}
return 0;
}
/*
运行结果:
1 2
3 4
4 5
1 2
3 4
4 5
*/
热心网友
时间:2023-10-11 01:11
例如对整型二维数组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]); 希望对你有所帮助。追问你说的我能看懂但是我不是很明白为啥不可以我那样写,一维数组里面的元素也是数组这样写错在哪里?
热心网友
时间:2023-10-11 01:12
定义的时候int a[3][2]代表三行两列的整型数组
使用的时候是循环不到a[3][2]的,三行两列的整型数组最多可以访问到a[2][1],因为数组下标是从0开始的,切记不要越界哦~
热心网友
时间:2023-10-11 01:13
楼主,C语言定义数组后要再像你这样赋值只能逐个赋值或者采用循环的方法了。
C语言就是这样。因为定义完数组后,第一a[3][4]并不代表一个数组,第二数组中没有这个元素。(越界)