C 语言初级入门--二维数组和指针
程序员文章站
2022-04-30 19:37:19
...
/*
二维数组的定义和二维数组元素的引用
二维数组的定义:
当数组中的每个元素带有两个下标时,称这样的数组为二维数组;
(逻辑上把数组看成一个具有行和列的表格或一个矩阵);
语法:
类型名 数组名[常量表达式1][常量表达式2]
二维数组的引用:
引用二维数组元素时必须带有两个下标,引用形式如下:
例如:
int a[3][4]; 引用:a[0][1]
注:两个引用的下标不能越界;
使用方法同java;
1.2、通过赋值定义二维数组的大小
对于二维数组,只可以省略第一个括号中的常量表达式,而不能省略第二个方括号中的
常量表达式;
int a[][3] = {{1,2},{4,5}};
int a[][3] = {1,2,3,4,5}; --说明:每行是三个元素,前三个元素放在
第一行,后两个放在第二行; 就是先满足列的要求;
1.3、????二维数组与指针的关系和使用!
4、二维数组和指针:
二维数组和数组元素的地址:
int *p,a[3][4];
a、二维数组a由若干个一维数组组成;
b、对于一个指针变量P 的类型与a[i]相同,则p=a[i]是对的;
5、 二维数组名也是一个地址常量:
二维数组名同样也是一个存放地址常量的指针,其值为二维数组中第一个元素的地址;
以上:a的值与a[0]的值是相同的;
二维数组名应理解为一个行指针。
6、二维数组元素的地址:
表示方法:&a[i][j]
a[i]+j a[i]--行地址 j所在行的列标
*(a+i)+j a[i]=*(a+i) 等价代换
&a[0][0]+4*i=j
a[0]+4*i+j
7、通过地址引用二维数组中的元素:
a[i][j]
*(a[i]+j)
*(*(a+i)+j)
(*(a+i))[j]
*(&a[0][0]+4*i+j)
8、通过建立一个指针数据引用二维数组元素:
int *p[3],a[3][2],i,j;
说明符:*p[3]中,也遵照运算符的优先级,一对[]的优先级高于*号,
因此p首先与[] 进行结合,构成p[3] ,说明了P 是一个数组名,系统
将为它开辟3个连续的存储单元,在它前面的*号则说明了数组P是批指针类型,它的每个
元素都是基本类型为int 的指针;
例如:
for(i=0;i<3;i++)
p[i] = a[i];
这就意味着每一个指针都指向了a数组中的每行的开头;
9、通过建立一个行指针引用二维数组元素
int a[3][2],(*prt)[2];
为什么是(*prt),因为要先与prt 结合,表明prt是一个指针;
然后与[2]结合,说明指针变量prt的基本类型是一个包含有两个int
元素的数组;
10、二维数组名和指针数组作为实参:
a、二维数组名作为实参时实参和形参之间的数据传递;
当二维数组名作为实参时,对应的形参必须是一个行指针的变量;
11、指针数组作为实参时,实参和形参之间的数据传递;
当指针数组名作为实参时,对应的形参应当是一个指向指针的指针:
例如:
duoble *ps[M]
fun(ps);
则:fun函数的首部为以下的几种形式:
fun(double *a[M]); //
fun(double *a[ ]); //接受一个指针数组
fun(double **a); //指向指针的指针
12、案例:通过调用随机函数给5*6的二维数组元素赋值10-40 内的证书
并求出每行元素的平均值;
*/
二维数组的定义和二维数组元素的引用
二维数组的定义:
当数组中的每个元素带有两个下标时,称这样的数组为二维数组;
(逻辑上把数组看成一个具有行和列的表格或一个矩阵);
语法:
类型名 数组名[常量表达式1][常量表达式2]
二维数组的引用:
引用二维数组元素时必须带有两个下标,引用形式如下:
例如:
int a[3][4]; 引用:a[0][1]
注:两个引用的下标不能越界;
使用方法同java;
1.2、通过赋值定义二维数组的大小
对于二维数组,只可以省略第一个括号中的常量表达式,而不能省略第二个方括号中的
常量表达式;
int a[][3] = {{1,2},{4,5}};
int a[][3] = {1,2,3,4,5}; --说明:每行是三个元素,前三个元素放在
第一行,后两个放在第二行; 就是先满足列的要求;
1.3、????二维数组与指针的关系和使用!
4、二维数组和指针:
二维数组和数组元素的地址:
int *p,a[3][4];
a、二维数组a由若干个一维数组组成;
b、对于一个指针变量P 的类型与a[i]相同,则p=a[i]是对的;
5、 二维数组名也是一个地址常量:
二维数组名同样也是一个存放地址常量的指针,其值为二维数组中第一个元素的地址;
以上:a的值与a[0]的值是相同的;
二维数组名应理解为一个行指针。
6、二维数组元素的地址:
表示方法:&a[i][j]
a[i]+j a[i]--行地址 j所在行的列标
*(a+i)+j a[i]=*(a+i) 等价代换
&a[0][0]+4*i=j
a[0]+4*i+j
7、通过地址引用二维数组中的元素:
a[i][j]
*(a[i]+j)
*(*(a+i)+j)
(*(a+i))[j]
*(&a[0][0]+4*i+j)
8、通过建立一个指针数据引用二维数组元素:
int *p[3],a[3][2],i,j;
说明符:*p[3]中,也遵照运算符的优先级,一对[]的优先级高于*号,
因此p首先与[] 进行结合,构成p[3] ,说明了P 是一个数组名,系统
将为它开辟3个连续的存储单元,在它前面的*号则说明了数组P是批指针类型,它的每个
元素都是基本类型为int 的指针;
例如:
for(i=0;i<3;i++)
p[i] = a[i];
这就意味着每一个指针都指向了a数组中的每行的开头;
9、通过建立一个行指针引用二维数组元素
int a[3][2],(*prt)[2];
为什么是(*prt),因为要先与prt 结合,表明prt是一个指针;
然后与[2]结合,说明指针变量prt的基本类型是一个包含有两个int
元素的数组;
10、二维数组名和指针数组作为实参:
a、二维数组名作为实参时实参和形参之间的数据传递;
当二维数组名作为实参时,对应的形参必须是一个行指针的变量;
11、指针数组作为实参时,实参和形参之间的数据传递;
当指针数组名作为实参时,对应的形参应当是一个指向指针的指针:
例如:
duoble *ps[M]
fun(ps);
则:fun函数的首部为以下的几种形式:
fun(double *a[M]); //
fun(double *a[ ]); //接受一个指针数组
fun(double **a); //指向指针的指针
12、案例:通过调用随机函数给5*6的二维数组元素赋值10-40 内的证书
并求出每行元素的平均值;
*/
#include<stdio.h> #include<stdlib.h> #define M 6 #define N 5 void getdata(int (*)[M]); void lineave(int[][M],float *); void outdata(int[N][M],float *); main() { int r[N][M]; float ave[N]; getdata(r); //二维数组的名字作为实参传递了,对应的形参为:行指针、同类型大小的输出、行标不写的数组; lineave(r,ave); outdata(r,ave); /* int a[2][3],i,j; printf("enter data by line:\n"); for(i=0;i<2;i++) for(j=0;j<3;j++) scanf("%d",&a[i][j]); printf("output a 2-dimension array:\n"); for(j=0;j<2;j++) { for(i=0;i<3;i++) { printf("%4d",a[i][j]); } printf("\n"); } */ } void getdata(int (*sp)[M]) { int i,j,x; for(i=0;i<N;i++) { j=0; while(j<M) { x = rand()%41; if(x>10) { sp[i][j] = x; j++; } } } } void lineave(int s[][M], float *a) { int i,j,ave; for(i=0;i<N;i++) { ave=0.0; for(j=0;j<M;j++) { ave=ave+s[i][j]; } a[i]=ave/M; } } void outdata(int sp[N][M],float a[]) { int i,j; printf("output the result:\n"); for(i=0;i<N;i++) { for(j=0;j<M;j++) { printf("%4d",sp[i][j]); } printf(":%6.2\n",a[i]); } putchar('\n'); }
下一篇: TCP之选项TCP_KETEPALIVE