对于一个二维数组a[3][3]
void maxmin(int (*t)[3],int m);
int c[3][3]={1,4,5,6,7,8,9,11,21};
void main()
{
int i,j,m;
int (*p)[3];
p=c;m=3;
maxmin(p,3);
}
void maxmin(int (*t)[3],int m)
{
int a,b,min,max;
float sum=0;
max=c[0][0];
min=c[0][0];
for(a=0;a<m;++a)
for(b=0;b<3;++b)
{
if(max<*(*(t+a)+b))
{
max=*(*(t+a)+b);
}
if(min>*(*(t+a)+b))
{
min=*(*(t+a)+b);
}
sum+=*(*(t+a)+b);
}
printf("
平均数位:%f
最大数:%d
最小数:%d
",sum/9, max,min);
}
二维数组如:
a[3][3];
a[0] = {1,2,3};
a[1] = {3,4,5};
a[2] = {5,6,7};
p指向二维数组;
p[1] == a[1]
/*
a &a &a[0][0]都是指着数组的首地址
差别见代码部分,输出结果
*/
#include <iostream>
using namespace std;
int main()
{
int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
/************************************************************/
cout << " &a = " << &a << endl;
cout << " &a+1 = " << &a+1 << endl << endl;//偏移了整个二维数组a[3][3]字节的量
/************************************************************/
cout << " a = " << a << endl;
cout << " *a+1 = " << *a+1 << endl;
cout << " a+1 = " << a+1 << endl << endl;//偏移二维数组a[3][3]的a[i]字节的量
/************************************************************/
cout << " a+1 = " << a+1 << endl;
cout << " (a+1)+1 = " << (a+1)+1 << endl << endl;//偏移二维数组a[3][3]的a[i]字节的量
/************************************************************/
cout << " &a[1][0] = " << &a[1][0] << endl;
cout << " &a[1][0]+1 = " << &a[1][0]+1 << endl << endl;//偏移了一个int字节的量
/************************************************************/
cout << " *(a+1) = " << *(a+1) << endl;
cout << " *(a+1)+1 = " << *(a+1)+1 << endl; //偏移了一个int字节的量
/************************************************************/
cout << " **a = " << **a << endl; //抽取第一个元素的值
cout << " **(a+1) = " << **(a+1) << endl << endl; //抽取第四个元素的值
/************************************************************/
/*
cout << " *(a+1) = " << *(a+1) << endl
这里为什么是输出a[i]的地址而不是元素值。
a *a **a
a 是说明这个数组有3行。
*a 是说明每行有3个元素
**a是说明每行中的每个元素
打印函数只打印内置的数据类型,并不提供输出数组类型的。
只有具体指向某个int类型值才能正确输出来
*/
}
举个例子
一本书 做"上" " 中" "下" 三部分个标签。不管怎么未翻开的书,显示总是封面的。
&a表示这本书 &a+1 直接把这本书翻完了、
a表示这本书三部分 a+1直接翻过上部,到中部了
*a表示表示这本上部分 *a+1翻过封面的直接到第一页了。
**a 就是表示这本呢书封面
我们不可能把一本书看看了封面就丢了吧。
是从封面一页一页的内容读。
若读得绝得不爽了,我就可以直接跳到看看结局。实际我们还是读的是页面的内容。
int a[6] = {5, 7, 8, 9, 10, 11};
1、 a; &a[0]; &a;三个地址数值都一样
2、a代表为此数组的首地址和&a[0]一样,如果加1的话都是跨越sizeof(int)个字节(即下一元素)。
3、其中a是比较特殊。(取a的地址和a在数值上一样):
a、如果用sizeof(a);值是为3 * sizeof(int)为整个数组空间的小大,由于a代表此数组的首地址且数组为int类型可以赋给int类型的指针,加1的话是跨越sizeof(int)个字节(即下一元素)。
b、由于a所代表整个的数组空间,&a是代表整个数组空间的首地址,如果加1的话就是跨越3*sizeof(int)个字节。如果表达示:int *p = &a; 这样就不会有警告,数据类型不兼容。
****************************************************************
再来看二维数组织。
int b[2][3] = {{5, 7, 8},{9, 10, 11}};
1、*b, b[0], b, &b[0], &b 和&a[0][0], *a[0]个地址数值都一样
2、注意一点二维数组是一个一维数组(行)中的元素也是一维数组(列)。(我是这样理解的)
3、用sizeof()分别求出*b、b[0]空间都为3 *sizeof(int)个字节(每行的空间大小)。但是如果加1的话中是跨越的空间是sizeof(int)个字节(即0行下一元素),也相当于一维数组名a。也是可以赋值给int类型的指针。(**b和*b[0]就是a[0][0]了)
4、再来看下b和&b[0](想一想:上面的*b和b[0]可以说是等效的,那么&b[0] 等效于&(*b) 这样就变成了b了,这是我的理解,在程序中&(*b)这样表达式是不行), 用sizeof()求出b为6 * sizeof(int)整个数组空间的小大,但是加1的话是跨越3*sizeof(int)个字节。如果表达示:int *p = b; 这样就不会有警告,数据类型不兼容。
5、由于b又是代表整个的数组空间,&b是代表整个数组空间的首地址,如果加1的话就是跨越6*sizeof(int)个字节。如果表达示:int *p = &b; 这样就不会有警告,数据类型不兼容。
其实不管是几维的数组,其实在内存中都是线性储存的,只是计算机对这块区域的分不同的基本空间大小。
如果是一维数组,a+i就是表示i+1个元素,记住数组下标是从0开始的。
然而二维数组,形式就是这样:2 3 4
5 6 7
这样的你要确定一个元素,第一要知道它在第几行,在要知道是第几列,这样才能确定一个元素。
*(a+i) 不是其中的元素而是第 i+1 行的首地址
&a[0]与&a[0][0]表示的是同一个地址
建议你还是找本书好好看看数组与指针,这个对于C语言很重要!!
首先&a[0]与&a[0][0]是不相等的,因为一个二维数组和一个一维数组是不能比较的,
a表示其首地址&a[0][0],a+i就是偏移量为i的元素地址,可以理解为行偏移量*(a+i)是表示第i行的首地址,*(a+i)等效于*(*(a+i)+j),此时j=0;即a[i][0],也就是是说第第i行的首地址了。
首先有一点是正确的a与&a[0][0]与&a[0]的地址的确是相同的,但是它们加1的含义却不同。你可以把a当作行指针,他表示的是一行的首地址(虽然这个地址值与这行的首元素地址值相同,但是含义不同),它加1代表移动一行,而不是1个元素。
int a[3] [3] ={1,2,3,4,5,6,7,8,9};
这个二维数组实际上是一个有3个元素的一维数组,其中数组的元素又是一个有3个元素的一维数组。我们先按行优先重新排列一下:int a[3][3]= { 1,2,3,4,5,6,7,8,9 };C和C++中的数组是从0开始编号的,第1行:a[0][0],a[0][1],a[0][2]第2行:a[1][0],a[2][1],a[1][...
int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};中a[1]是不是常量,为什么
int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};这是一个3*3的二维数组. a[1]是a[1][0]的地址,即第二行首地址. 可以认为是常量指针.类型相当于int *型.q=a[1] 类型匹配. 可以赋值.而&a[1] 并不是int **型, 而是一个数组指针, 类型为int (*)[3].所以 int (*m)[3]...
*(a+3)是什么意思
如果有一个二维数组a[3][3]那么a表示首行地址(从宏观来说,就是第一行3个元素的地址)a表示0行0列元素地址(微观角度)那么*(a+3)就表示3行0列元素地址 同理,*(a+3)+1就表示3行1列元素地址
用C语言编写一个3x3的二维数组,求对角线的和
创建一个3x3的二维数组是相对简单的任务。你可以通过定义 int A[3][3]; 来实现,这里x=3,y=3。在编写程序时,你需要考虑主对角线和副对角线的求和。主对角线的求和相对直接。只需要在循环中,当x等于y时,将对应的数组元素值相加。这样就能得到主对角线的总和。副对角线的求和需要稍微注意一下...
在计算机C语言中,二维数组,a[][3]={1,2,3,4,5,6,7,8,9};a[0][0]=...
二维数组初始化时,可以采用上面这种方式,系统会根据总个数和第二位的长度算出第一位的长度。 上面数组中总共有9个元素,每行有3个元素,可以确定行数是3,也就是a[3][3]。另外数组中的元素是按行存放的,先存第一行,再放第二行,依次存放。还有就是数组的下表是从0开始,如果有3个元素...
为什么二维数组(a[][3])[3]=3
首先a[][3]={1,2,3,4,5,6}表示将1到6这六个数字按三个数进行分组,即每三个数字为一行形成一个二维数组:第0行是1,2,3;第1行是4,5,6.因为p=a,则(*p)[2]相当于(*a)[2];又因为a作为二维数组的首地址(也就是a[0][0]的地址),则*(a+i)表示第一个维度(即第i行)的...
(c语言)任意输入一个3行3列的二维数组,求对角之和。大神们帮帮忙_百度...
include<stdio.h>\/\/加入头文件 void main() { int a[3][3];\/\/定义一个3行3列的二维数组 int i,j,s=0; for(i=0;i<3;i++)\/\/用两个循环来输入数组 for(j=0;j<3;j++) scanf("%d",&a[i][j]); for(i=0;i<3;i++) s=s+a[i][i];\/\/求斜向右下的...
c语言中a[3][3]是什么意思?
a表示数组名,也代表数组首地址。此首地址并非a[0][0]元素的地址,而是a[0]这个数组的地址(虽然具体数值一样,但意义不同);所以对于2为数组a[3][3]; a+1 表示的是一维数组a[1]的地址,(a+1)表示的是数组a[1]中第一个元素的地址,所以*(*(a+1)+2)表示数组a[1]中第3个元素的...
二、定义一个3*3的整型二维数组 1) 让用户从键盘输入9个整数 2)输出3...
include <stdio.h>int main(){ int a[3][3]; int i,j; int max; \/\/1 for(i = 0; i<3;i++) for(j = 0; j < 3; j ++) scanf("%d",&a[i][j]); \/\/2 for(i = 0; i<3;i++) { for(j = 0; j < 3; j ++) printf("...
多维数组int a[3][3];*a和a是相同的地址,为什么*a+1和a+1就不一样...
二维数组 就是 数组 的 数组。把a看出一个一维数组,那么每个元素又是一个一维数组。先把a看成一维数组,a[0] 是什么东西先不管,那么 a 也就是第 0 行的首地址。a + 1 就是 第二行的 首地址 a 在这里就是 a[0] 的地址 ,所以 *a + 1 就相当与 a[0+1] == a[1]...