当前位置:网站首页>二维数组&指针
二维数组&指针
2022-08-09 12:26:00 【进击的李知因】
导言:二维数组在内存中以一维数组的形式存放,所以二维数组可以看成由若干个一维数组构成。
1、行地址&列地址
?行地址:
a &a[0] (指向第0行)
a+i &a[i] (指向第i行)
?列地址:
a[0] &a[0][0] (指向第0行0列)
a[0]+i &a[0][i] (指向第0行i列)
2、行地址?列地址
- 行地址指向一行元素(一个一维数组)
- 列地址指向一个元素
3、一维数组与二维数组的关系
一维数组的地址二维数组的行指针,指向该行元素,如&a[i] a+i
一维数组的元素二维数组的行数组名,指向该行第一个元素,如a[i] &a[i][0]
4、a?a[0]
a是二维数组名,行指针,增1指向下一行
a[0]是行数组名,列指针,增1指向下一列
?行指针
①定义:int (*p)[4];(定义了一个指针变量,指向含有4个元素的整型数组)
②初始化:p=a;或 p=&a[0];
③引用
地址&a[i][j]→ *(p+i)+j
元素a[i][j]→ p[i][j] * (p[i]+j) * (* (p+i)+j) (*(p+i))[j]
?列指针
①定义:int *p;(将二维数组看成m行n列的一维数组)
②初始化:p=*a;或 p=a[0];或 p=&a[0][0];
③引用
地址&a[i][j] → &p[i*n+j]
元素a[i][j] → p[i* n+j] * (p+i*n+j)
示例:输入一个3行4列的二维数组并输出
方法1——二维数组作形参
#include <stdio.h>
#define N 4
void InputArray(int p[][N], int m, int n);
void OutputArray(int p[][N], int m, int n);
int main()
{
int a[3][4];
printf("Input 3*4 numbers:\n");
InputArray(a, 3, 4); /* 向函数传递二维数组的第0行的地址 */
OutputArray(a, 3, 4); /* 向函数传递二维数组的第0行的地址 */
return 0;
}
/* 形参声明为列数已知的二维数组,输入数组元素值 */
void InputArray(int p[][N], int m, int n)
{
int i, j;
for(i = 0; i<m; i++)
for(j = 0; j<n; j++)
scanf("%d", &p[i][j]);
}
/* 形参声明为列数已知的二维数组,输出数组元素值 */
void OutputArray(int p[][N], int m, int n)
{
int i, j;
for(i = 0; i<m; i++)
{
for(j = 0; j<n; j++)
printf("%4d", p[i][j]);
printf("\n");
}
}
方法2——行指针作形参
#include <stdio.h>
#define N 4
void InputArray(int (*p)[N], int m, int n);
void OutputArray(int (*p)[N], int m, int n);
int main()
{
int a[3][4];
printf("Input 3*4 numbers:\n");
InputArray(a, 3, 4); /* 向函数传递二维数组的第0行的地址 */
OutputArray(a, 3, 4); /* 向函数传递二维数组的第0行的地址 */
return 0;
}
/* 形参声明为指向列数已知的二维数组的行指针,输入数组元素值 */
void InputArray(int (*p)[N], int m, int n)
{
int i, j;
for(i = 0; i<m; i++)
for(j = 0; j<n; j++)
scanf("%d", *(p+i)+j);
}
/* 形参声明为指向列数已知的二维数组的行指针,输出数组元素值 */
void OutputArray(int (*p)[N], int m, int n)
{
int i, j;
for(i = 0; i<m; i++)
{
for(j = 0; j<n; j++)
printf("%4d", *(*(p+i)+j));
printf("\n");
}
}
方法3——列指针作形参(推荐,二维列数动态可变)
#include <stdio.h>
void InputArray(int *p, int m, int n);
void OutputArray(int *p, int m, int n);
int main()
{
int a[3][4];
printf("Input 3*4 numbers:\n");
InputArray(*a, 3, 4); /* 向函数传递二维数组的第0行第0列的地址 */
OutputArray(*a, 3, 4); /* 向函数传递二维数组的第0行第0列的地址 */
return 0;
}
/* 形参声明为指向二维数组的列指针,输入数组元素值 */
void InputArray(int *p, int m, int n)
{
int i, j;
for(i = 0; i<m; i++)
for(j = 0; j<n; j++)
scanf("%d", &p[i*n+j]);
}
/* 形参声明为指向二维数组的列指针,输出数组元素值 */
void OutputArray(int *p, int m, int n)
{
int i, j;
for(i = 0; i<m; i++)
{
for(j = 0; j<n; j++)
printf("%4d", p[i*n+j]);
printf("\n");
}
}
边栏推荐
- 合并两个有序列表
- Flutter入门进阶之旅(三)Text Widgets
- Batch大小不一定是2的n次幂!ML资深学者最新结论
- Compensation transaction and idempotency guarantee based on CAP components
- The new features of ABP 6.0.0 - rc. 1
- 二叉树的序列化和反序列化
- 用场景定义硬件,英码科技破解“边缘计算”密码
- Here comes the question: Can I successfully apply for 8G memory on a machine with 4GB physical memory?
- LnReader编译
- Do you know the difference between comments, keywords, and identifiers?
猜你喜欢

世界第4疯狂的科学家,在103岁生日那天去世了

Flutter Getting Started and Advanced Tour (7) GestureDetector

用场景定义硬件,英码科技破解“边缘计算”密码

Rust从入门到精通04-数据类型

Flutter入门进阶之旅(六)Layout Widget

Simple understanding of ThreadLocal

Go Affair, How to Become a Gopher and Find a Go Job in 7 Days, Part 1

脱光衣服待着就能减肥,当真有这好事?

How to save Simulink simulation model as image or PDF

两个链表相加
随机推荐
[HCIP Continuous Update] Principle and Configuration of IS-IS Protocol
MySQL5.6到8.0的账号迁移
Too much volume... Tencent was asked on the side that the memory was full, what would happen?
微服务架构的核心关键点
如何修改data work上jdbc驱动的版本
手写大根堆
用 API Factory 产品生成 API 文档
Flutter入门进阶之旅(十)Dialog&Toast
JVM常用监控工具解释以及使用
注释、关键字、标识符的区别你知道吗?
Go Affair, How to Become a Gopher and Find a Go Job in 7 Days, Part 1
h264协议
荣耀携手Blue Yonder,加快企业战略增长
Flutter Getting Started and Advanced Tour (2) Hello Flutter
非科班AI小哥火了:他没有ML学位,却拿到DeepMind的offer
MySQL 原理与优化,Group By 优化 技巧
Rust从入门到精通04-数据类型
Customize VIEW to realize in-app message reminder to rotate up and down
How to upload local file trial version in binary mode in ABAP report
批量读取word docx文件指定表格内容,保存在excel文件中