/*
二维数组的定义和二维数组元素的引用
二维数组的定义:
当数组中的每个元素带有两个下标时,称这样的数组为二维数组;
(逻辑上把数组看成一个具有行和列的表格或一个矩阵);
语法:
类型名 数组名[常量表达式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');
}
分享到:
相关推荐
C 语言初级入门--二维数组和指针 C 语言初级入门--概念简介 C 语言初级入门--关系运算与逻辑运算 C 语言初级入门--函数、字符常量 C 语言初级入门--循环 C 语言初级入门--一维数组和指针 C 语言初级入门--字符串
初级阶段:C语言基础入门:1 C语言的发展历史,环境安装及调试2 数据类型与运算符-scanf3 进制讲解-浮点数-字符型4 混合运算-scanf读取标准输入原理5 scanf循环读取-多种数据类型混合读取-printf讲解6 运算符与...
- **定义**: 二维数组是一个数组的数组。 - **格式**: ```java 元素类型[][] 数组名 = new 元素类型[行数][列数]; ``` 示例: ```java int[][] arr = new int[3][2]; ``` - 这里定义了一个名为`arr`的二维...
6. **数组**:介绍一维、二维数组的声明、初始化和操作。 7. **函数**:讲述函数的定义、调用、参数传递和返回值。 8. **指针**:深入讲解指针的概念,如何声明、初始化和操作指针,以及指针与数组、函数的关系。 9....
二维数组指针变量说明的一般形式为: 类型说明符 (*指针变量名)[长度] 其中“类型说明符”为所指数组的数据类型。“*”表示其后的变量是指针类型。 第十三讲 结构 “结构”是一种构造类型,它是由若干...
二维数组指针变量说明的一般形式为: 类型说明符 (*指针变量名)[长度] 其中“类型说明符”为所指数组的数据类型。“*”表示其后的变量是指针类型。 第十三讲 结构 “结构”是一种构造类型,它是由若干...
了解一维、二维数组的创建、初始化和操作是数组部分的重点。 四、字符处理 C语言中,字符数据类型(char)用于处理单个字符。标准库中的字符处理函数如scanf和printf可以用于输入和输出字符。此外,字符数组和字符串...
总的来说,"C语言初级教程 讲座"涵盖了C语言的基础知识和核心概念,适合初学者入门。通过学习和实践,你将能够编写出具有逻辑性和有效性的C语言程序。记得,编程最重要的是动手实践,不断编写代码才能更好地理解和...
GP(GNUPlot)则是一个命令行工具,能够生成二维和三维的图形,尤其适合科学家和工程师在数据分析和可视化时使用。 基于以上信息,我们可以期待压缩包中包含以下内容: 1. **C语言基础**: - 变量、数据类型、...
- **多维数组**:理解二维数组及其操作。 5. **方法**: - **方法定义与调用**:参数传递、返回值类型和void方法。 - **重载**:相同方法名但参数列表不同的方法。 6. **类与对象**: - **类的概念**:类作为...
4. 深入理解数组,包括一维数组、二维数组的声明和操作。 5. 掌握字符串的处理,了解字符串在C语言中的表示和常用操作。 6. 熟悉指针的概念,理解指针的运算和使用,包括指针与数组、函数的关系。 7. 实践文件操作,...
7. **数组**:介绍一维、二维数组的声明、初始化和操作,以及数组在内存中的布局。 8. **指针**:深入解析指针的概念,包括指针变量的声明、赋值、解引用,以及通过指针操作数组和函数。 9. **字符串**:讲述C语言...
作业可能会涉及一维、二维数组的操作,如遍历、查找、排序等。 6. **指针**:C语言的指针是其强大特性之一,它允许直接操作内存。作业可能涉及指针的声明、赋值、解引用,以及通过指针进行数组和函数参数的传递。 ...
第四章 数组:数组是数据结构中最基础的元素,本章深入讲解了一维数组、二维数组以及多维数组的概念和操作,同时也涉及动态数组(如vector)的使用,强调了数组在存储和处理大量数据时的作用。 第五章 初露锋芒:此...
6. 第六章涵盖了数组,包括一维、多维、字符数组和字符串的使用。 7. 第七章介绍结构体、联合体和枚举类型,这些都是自定义数据类型的工具。 8. 第八章讲解指针和引用,这是C++中非常重要的概念,也是难点之一。 第...
3. **数据结构**:为了高效地管理棋盘,可以使用二维数组或自定义的数据结构来表示棋盘。同时,链表或队列可以用于记录每步棋的记录,便于回溯或重播。 4. **函数**:编写一系列的函数来实现游戏的逻辑,比如判断...
Java数组倒置 简单 Java图片加水印,支持旋转和透明度设置 摘要:Java源码,文件操作,图片水印 util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印...