A. c语言二维数组
这个就是指针数组和数组指针的区别了,我当年也在这里转了很久,希望我下面所说得可以帮到你。
首先,明确编译器是怎么识别*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]的方式比较方便,稍微浪费点空间问题不大,重要的是看起来好看,不容易出错。
B. c语言中如何获取一个二维数组的行列数
有两种方式:
1 二维数组的行列数在定义的时候就是确定好的,所以编程人员是知道二维数组的大小以及行列数的。 所以可以直接使用行列数的值。
为方便维护,可以将行列数定义为宏,直接调用对应的宏名作为行列值。
2 动态获取。
对于type array[A][B];形式的二维数组,可以通过计算sizeof获取行列数。
sizeof(array[0][0])为一个元素占用的空间,
sizeof(array[0])为一行元素占用的空间,
sizeof(array)为整个数组占用的空间,
于是:
行数 = sizeof(array)/sizeof(array[0]);
列数 = sizeof(array[0])/sizeof(array[0][0]);
C. c语言编程:找出二维数组中的最大值最小值及其所在行号列号
示例:有一个3*4的矩阵,要求编程序求出其中最大的那个元素的值,以及其所在的行号和列号。
代码:
#include<stdio.h>
int main()
{
int i,j,row=0,colum=0,max;
int a[3][4]={{1,2,3,4},{4,5,6,7},{-1,3,-5,10}};
max=a[0][0];
printf("array a: ");
for(i=0;i<=2;i++)
{
for(j=0;j<=3;j++)
{
printf("%5d",a<i>[j]);
}
printf(" ");
}
for(i=0;i<=2;i++)
{
for(j=0;j<=3;j++)
{
if(a<i>[j]>max)
{
max=a<i>[j];
row=i;
colum=j;
}
}
}
printf("max=%d row=%d colum=%d ",max,row,colum);
return 0;
}
运行结果:
(3)c语言找二维数扩展阅读:
printf用法:
1、printf()函数是格式化输出函数,一般用于向标准输出设备按规定格式输出信息。
格式输出,它是c语言中产生格式化输出的函数(在stdio.h中定义)。用于向终端(显示器、控制台等)输出字符。格式控制由要输出的文字和数据格式说明组成。
要输出的文字除了可以使用字母、数字、空格和一些数字符号以外,还可以使用一些转义字符表示特殊的含义。
简单点理解就是,在一段程序中你正确使用该函数,可以在该程序运行的时候输出你所需要的内容。
2、printf函数是一个标准库函数,它的函数原型在头文件“stdio.h”中。但作为一个特例,不要求在使用printf函数之前必须包含stdio.h文件。
D. C语言 二维数组
/***用二维数组保存学生成绩****/
#include"stdio.h"
#define M 100
main()
{ int i,a[M][2],n,c=0,m=0,max,min;
printf("请输入学生记录数:");
scanf("%d",&n);
/*********输入每个学生的成绩保存在数组中*********/
for(i=0;i<n;i++)
{printf("请输入第%d学生的记录\n",i+1);
printf("请输入语文成绩:");
scanf("%d",&a[i][0]);
printf("请输入数学成绩:");
scanf("%d",&a[i][1]);
printf("\n"); }
/********各课总成绩********************/
for(i=0;i<n;i++)
{c+=a[i][0];
m+=a[i][1];
}
printf("语文总成绩:%d\n",c);
printf("数学总成绩:%d\n",m);
printf("语文平均成绩:%f\n",(float)(c)/n);
printf("数学平均成绩:%f\n\n",(float)(m)/n);
/**********输出成绩单*********/
for(i=0;i<n;i++)
{printf("第%d个学生:语文成绩%d 数学成绩%d\n",i+1,a[i][0],a[i][1]);
}
getch();
}
E. C语言程序设计:求二维数组中最大元素值及其行列号
#include <stdio.h>
void main()
{
int i,j,row = 0 ,colum = 0,max;
int a[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}};
max = a[0][0];
for(i=0;i<=2;i++)
for(j=0;j<=3;j++)
if(a[i][j]>max)
{
max = a[i][j];
row = i;
colum = j;
}
printf("最大值=%d 行号= %d 列号= %d ",max,row,colum);
}
(5)c语言找二维数扩展阅读:
数组使用规则:
1.可以只给部分元素赋初值。当{ }中值的个数少于元素个数时,只给前面部分元素赋值。例如:static int a[10]={0,1,2,3,4};表示只给a[0]~a[4]5个元素赋值,而后5个元素自动赋0值。
2.只能给元素逐个赋值,不能给数组整体赋值。例如给十个元素全部赋1值,只能写为:static int a
[10]={1,1,1,1,1,1,1,1,1,1};而不能写为:static int a[10]=1;请注意:在C、C#语言中是这样,但
并非在所有涉及数组的地方都这样,数据库是从1开始。
3.如不给可初始化的数组赋初值,则全部元素均为0值。
4.如给全部元素赋值,则在数组说明中, 可以不给出数组元素的个数。例如:static int a[5]=
{1,2,3,4,5};可写为:static int a[]={1,2,3,4,5};动态赋值可以在程序执行过程中,对数组作动态赋
值。这时可用循环语句配合scanf函数逐个对数组元素赋值。
网络-数组
F. C语言中二维数组找到每行的最大值
思路和想法完全正确,仔细看应该是给b[]赋值没有写对位置,在往后一步,放在大括号外面,应该循环比较是两层循环加一个if比较,所以要把赋值在往后移动,等比较全部完成后再赋值给数组保存。
#include<stdio.h>
//首先指定M和N的值
#define M 3
#define N 3
int main()
{
printf("There are %d rows %d columns.
", M, N); //输出到屏幕的提示信息
int a[M][N] = { 0 }; //声明一个M行N列的数组,并将全部元素赋初值为0
int i, j; //for循环中要用到
for (i = 0; i < M; i++)
{
printf("input %d row's %d values: ", i + 1, N); //输出到屏幕的提示信息
for (j = 0; j < N; j++)
scanf("%d", &a[i][j]); //对第i行第j列的元素赋值
}
int maxArr[M] = { 0 }; //声明一个含有M个元素的一维数组来存储M个行最大值
for (i = 0; i < M; i++)
{
int max = a[i][0]; //先将每一行的第一个数作为最大值
for (j = 1; j < N; j++) //找出行最大值
if (max < a[i][j])
max = a[i][j];
maxArr[i] = max; //将行最大值存入行最大值数组中
}
for (i = 0; i < M; i++) //将每行最大的数输出
printf("%d ", maxArr[i]);
return 0;
}
(6)c语言找二维数扩展阅读:
二维数组A[m][n],这是一个m行,n列的二维数组。设a[p][q]为A的第一个元素,即二维数组的行下标从p到m+p,列下标从q到n+q,按“行优先顺序”存储时则元素a[i][j]的地址计算为:
LOC(a[i][j]) = LOC(a[p][q]) + ((i − p) * n + (j − q)) * t
按“列优先顺序”存储时,地址计算为:
LOC(a[i][j]) = LOC(a[p][q]) + ((j − q) * m + (i − p)) * t
存放该数组至少需要的单元数为(m-p+1) * (n-q+1) * t 个字节
G. c语言找二维数组的特定点,存在多个,记住第一个的位置
遍历二维数组,按照你说的特定点的要求,逐个检查,当第一个命中时,退出循环即可。
退出循环的下标值,就是要记住的值。
H. C语言二维数组
首先你要理解二维数组的真正含义,它的第一维就是一组数据的起始地址,第二维就是某组数据中的某个值.其次,你要知道a[][4]所表达的意思,是指二维数组a的每一维都是由4个元素组成的一维数组.而编译器可以根据你赋给a的初值个数计算它的第一维长度(元素总个数/4,如果不能整除,则长度加1,此时还应该有几个没有赋初值的数组元素).而a[3][]的意思从表面上看可以成立,但问题是编译器不能直接识别其第二维的确切长度(你可以考虑,如果总的初值个数为2时,可以认为a的第二维长度为1,也可以是2,.......),这样就会产生错误.所以,可以a[][4]={*,*,*……}这样定义,而不能定义a[3][]={*,*,*……}。
对于你补充的问题,其实我已经讲了.因为赋初值是5个元素,所以5/4=1,但除不尽,所以要加1,即实际数组a实质上定义为a[2][4],其内元素为:
1 2 3 4
5 0 0 0 (后面的三个0是系统默认值)
希望对你有所帮助.^-^
I. c语言中找出二维数组每行最大的数
int main(int argc, char** argv) {
int a,b;
printf("请输入数组行数,列数:\n");
scanf("%d,%d",&a,&b);
int num[a][b];
int max[a];
for(int i=0;i<a;i++)
max[i]=0;
for(int i=0;i<a;i++)
{
for(int j=0;j<b;j++)
{
printf("请输入数据:");
scanf("%d",&num[i][j]);
}
}
for(int i=0;i<a;i++)
{
for(int j=0;j<b;j++)
{
if(max[i]<num[i][j])
max[i]=num[i][j];
}
}
for(int i=0;i<a;i++)
printf("第%d行最大数为%d\n",i+1,max[i]);
}
J. C语言如何求一个二维数组有几行,还有为什么会提示gets()是一个未定义的标识符
C语言中求一个二维数组有几行的方法如下:
假设有定义int nums[10][20];
二维数组行数可以用sizeof计算:
rows = sizeof(nums)/sizeof(nums[0]);
第二个问题,为什么gets会提示未定义标识,有两种可能:
一、编译器支持gets库函数,但是你没有包含头文件#include<stdio.h>;
二、编译器本身不支持gets库函数,因为gets函数是一个不安全函数,容易导致数组越界,所以很多编译器都不再有这个库函数了。取而代之的是gets_s或者fgets这类相对安全的函数,可以试试。