C/C++ 指针数组、二维数组
一、 二维数组
1> 初始化
int a[3][3] = { {1,0,0}, {0,1,0}, {0,0,1} }; // 里面的括号是 {} , 而不是()
2> 将二维数组当做一维数组处理
// void Func(int array[3][10]) 相当于
// void Func(int array[][10]) 可变为
// void Func(int **array, int RowSize, int LineSize);
// *( (int *)array + i * LineSize + j ); 即把二维数组当作一维数组来处理
void print_array( int * p, int row, int line)
{
for(int i=0; i<row; ++i)
{
for(int j=0; j<line; ++j)
{
printf("%d \n", *( p + i * row + j ) ); // 相当于 *( *(p+i) + j ); // p[i][j]
// cout << stew(3) << a[]
}
}
}
// 调用
print_array( (int *)a, 3, 3 );
3> 二维数组当二维数组使用
void WordSort(char p[][10], int row)
{
char temp[10];
for(int n=0; n<row; ++n)
{
for(int m=n+1; m<row; ++m)
{
// 冒泡排序
if ( strcmp(p[m], p[n] ) < 0 )
{
strcpy(temp, p[n]);
strcpy(p[n], p[m]);
strcpy(p[m], temp);
}
}
}
for(int n=0; n<row; ++n)
{
printf("%s \n", p[n]);
}
}
// 调用
char p[5][10] = {"hello","world","111","135","134"};
WordSort(p, 5);
4> 行指针(二维数组作为形参的参数传递)
void print_1(int (*a)[3], int rowSize)
{
for(int i=0; i<3*rowSize; ++i) // 这里3乘以rowSize,3代表每一行拥有的元素个数。
{
printf("%d ", (*a)[i]);
if ( i%3 == 2)
printf("\n");
}
}
// 调用
print_1(a, 3);
// 打印数组内字符串
void print_string(char (*ptr)[20], int rowSize )
{
for(int i=0; i<rowSize; ++i)
{
printf("%s\n", ptr+i); // 这样写会有warning信息.
// warning: format '%s' expects argument of type 'char*', but argument 2 has type 'char (*)[10]'
}
}
// 调用
print_string(a, 6); // 其中a[6][20];
5> 动态分配二维数组行列大小
int m = 2; // 2行
int n = 3; // 3列
int **array = new int*[m]; // 分配行指针数组
for(int i=0; i<m; ++i)
{
array[i] = new int[n]; // 为每一行分配空间
}
// 赋值
array[i][j] = xxx;
// 释放
for(int i=0; i<m; ++i)
{
delete []array[i]; // 删除每一行分配的空间
}
delete []array; // 删除行指针数组
// 分配不等长的二维数组
int m = 3; // 行
int n[3] = {1,2,3}; // 每列的元素个数
int **array = new int*[m]; // 行指针数组
for(int i=0; i<m; ++i)
{
array[i] = new int[ n[i] ]; // 每行分配不一样多的空间
}
// 赋值
for(int i=0; i<m; ++i)
for(int j=0; j<n[i]; ++j)
array[i][j] = xxx;
// 释放
for(int i=0; i<m; ++i)
delete []array[i];
delete []array;
二、 指针数组
1> 区别
char *pc = new char(10); // 开辟一个字符空间,并初始化为10
// 相当于 char * pc = new char; *pc = 10;
// 释放
delete pc;
char *pca = new char[10]; // 开辟一个数组,可保存10个char元素
delete []pca;
2> 指针数组 与 数组指针 如何 指向 二维数组
int m[2][3] = { {1,0,0}, {0,1,0} };
int (*p)[3]; // 数组指针。 即行指针
int *q[3]; // 指针数组. 数组元素是指针,一共可存放3个int指针.
// 行指针(数组指针)
p = m; // p是行指针,可以直接指向二维数组.
// 输出
for(int i=0; i<2; ++i, ++p)
{
printf("%d ", **p); // 每一行第一个元素
printf("%d ", *(*p+1) ); // 每一行第二个元素
printf("%d ", *(*p+2) ); // 每一行第三个元素
printf("\n");
}
// 指针数组
int *q[3];
for(int i=0; i<2; ++i)
q[i] = a[i]; // q是数组, q[i] 是指针。
// 输出
for(int i=0; i<2; ++i)
{
for(int j=0; j<3; ++j)
{
printf("%d ", q[i][j]); // 或者下面输出
//printf("%d ", *(q[i] + j) );
}
printf("\n");
}
转载于:https://www.cnblogs.com/sylar-liang/p/4795648.html
C/C++ 指针数组、二维数组相关推荐
- 【C 语言】二级指针内存模型 ( 指针数组 | 二维数组 | 自定义二级指针 | 将 一、二 模型数据拷贝到 三 模型中 并 排序 )
文章目录 一.指针数组 和 二维数组 数据 拷贝到 自定义二级指针 中 1.函数形参 设计规则 2.三种内存模型 对应 函数形参 指针退化规则 二.完整代码示例 一.指针数组 和 二维数组 数据 拷贝 ...
- 【C 语言】二级指针作为输入 ( 二维数组 | 二维数组遍历 | 二维数组排序 )
文章目录 一.二维数组 1.二维数组声明及初始化 2.二维数组遍历 3.二维数组排序 二.完整代码示例 一.二维数组 前几篇博客中 , 介绍的是指针数组 ; 指针数组 的 结构特征 是 , 数组中的每 ...
- 二级(多级)指针,二级指针和二维数组的避坑,指针面试考题
1.二级指针的的认识 2.二级指针的实战 想获得二维数组的某个人的位置,采用的是return的方式 如果把第三行的int * 换成void ,把ppos换成传参的方式做. 结果崩溃了 原因是 是个野指 ...
- C语言指针和二维数组
二维数组在概念上是二维的,有行和列,但在内存中所有的数组元素都是连续排列的,它们之间没有"缝隙".以下面的二维数组 a 为例: int a[3][4] = { {0, 1, 2, ...
- C语言中的二级指针和二维数组问题
关于二级指针和二维数组两者差别很大,不可以直接用二级指针传递二维数组 首先来看看二维数组在内存中是如何组织的呢? 一维数组 T arr1 = new T[9] 二维数组T arr2 = new T[ ...
- C语言学习之利用指针输出二维数组任一行任一列元素的值
利用指针输出二维数组任一行任一列元素的值. int main(){int a[3][4];int i,j,x,y;int (*p)[4];//指针变量p指向包含4个整型元素的一维数组printf(&q ...
- c语言指针怎样代替二维数组,c语言 指针和二维数组
// 指针和二维数组 #include int main(int argc, const char * argv[]) { int a[3][6]; for (int i=0; i<3; i++ ...
- C ++ 指针 | 指针与二维数组_5
指针与二维数组 根据上面的图,我现在写一些语句,我们一起来判断输出值是多少!! int (*p)[3] = B; print B; 这个会打印多少? 思考一下....... ... ... ... 打 ...
- C++之指针探究(五):数组指针和二维数组
前文:C++之指针探究(四):指针和二维数组 回顾:初始化二维数组时可以"偷懒":int array[2][3]={{0,1,2},{3,4,5}}; 可以写成:int array ...
- C++之指针探究(四):指针和二维数组
前文:C++之指针探究(三):指针数组和数组指针 一. 二维数组 二维数组通常也被称为矩阵(matrix). 六种初始化方式: (1) int a[3][4] = {1,2,3,4,5,6,7,8 ...
最新文章
- [tomcat]源码简析 异步/非阻塞和请求构成
- mysql 优化器关联查询_MySQL 查询优化器(二)
- 汤阳光 Hibernate笔记
- 【kotin】统计字符串中的字母数(拓展函数)
- Failed to update system registry. Need permission to add?
- 报 There is insufficient memory for the Java Runtime Environment to continue. 的问题
- 手机上有没有学python的软件-【Learn Python】用手机学Python
- 【miscellaneous】语音识别工具箱综述和产品介绍
- weak和assign的区别
- 散粉在哪个步骤用_新手化妆步骤+50个美妆小技巧+化妆知识扫盲
- mysql 存储session
- 关于.dll文件的注册,如何注册.dll文件
- 年会互动游戏有哪些?年会微信互动游戏制作流程是什么?
- 3.5 基本属性测试
- 在标准IO库中,rewind函数作用?
- ElementUI 图标字体无法正常显示 本地CDN文件
- PageAdmin如何修改后台页面标题。
- Gridea+Coding Page个人网站搭建
- 微服务-Nacos动态配置中心
- 龙族幻想导入数据id_龙族幻想:一键捏脸数据ID 快速捏脸数据ID汇总分享
热门文章
- ubuntu10.04添加账户示例
- u-boot移植随笔:终于解决Nor Flash的问题了
- Linux下载安装zookeeper
- 【Elasticsearch】Elasticsearch 集群健康值黄色 解决方案 或者 分片 未分配
- 【Elasticsearch】Elasticsearch 基于scoll技术滚动搜索大量数据
- 【elasticsearch】 elasticsearch document 路由 (routing) 到shard
- 【Spring】Spring 如何更改动态更改运行中某个类的日志级别
- Spring :@Configuration 注解
- 19-linux下ElasticSearch.6.2.1与head、Kibana、X-Pack、SQL、IK、PINYIN插件的配置安装
- vue面试有哪些插件_vue 前端框架面试问题汇总