用c++c语言文件存储制作一个存储同学姓名的二维数组,要使用字符数组以及动态数组

04' 48''
视频有效期
教学服务期限
站住别动让我吃了你
自己有一些C的基础,对于课程我觉得很满意,老师还在课程中设置了选择和编程题,视屏对知识点的讲解个人觉得还不错,没有基础都是可以的。
是我要的入门课,老师讲的很认真细致,目前感觉自己学的挺好的,能跟下来,问答区的很多助教回答的问题也解决了我的一些疑问,必须给助教点个赞,希望后面课程的学习我也能顺利跟下来,还要靠小伙伴和助教们多多帮忙啦~
老师知识点讲的很仔细,比在学校学到的东西还有用!学完还可以练习,题多的,这点好。交了次作业,老师给的批复很详细的指出了问题,并给出了解决方法,很值得学习。
怎么买不了课程
您好,如果您使用的是iOS手机端,目前,只支持路径的学习,即购买之后可观看学习课程,购买需要到PC端或者Android端。祝学习愉快!
查看完整路径步骤C++语言程序设计课件Ch4--数组ppt下载_爱问共享资料
C++语言程序设计课件Ch4--数组.ppt
C++语言程序设计课件Ch4--数组.ppt
C++语言程序设计课件Ch4--数组.ppt
简介:本文档为《C++语言程序设计课件Ch4--数组ppt》,可适用于高等教育领域,主题内容包含内容提要数组的概念一维数组及其使用二维数组及其使用字符数组与字符串string类向量数组的概念前面已经讲过基本数据类型,如:整型字符型实型等C语言还符等。
侵权或盗版
*若权利人发现爱问平台上用户上传内容侵犯了其作品的信息网络传播权等合法权益时,请按照平台要求书面通知爱问!
赌博犯罪类
16人已下载
在此可输入您对该资料的评论~
添加成功至
资料评价:C++二维数组和指针的关系
借鉴了点击打开链接和点击打开链接,并部分修改。
再翻开C++ primer时,不禁感叹此书的严谨细致。再学习下数组和指针。主要讲解二维数组和指针的对应关系。
扫盲+复习:
数组是一种复合数据类型,对数据类型,必然要介绍定义和初始化。
定义和初始化:数组的维数必须用值大于等于1的常量表达式定义。此常量表达式只能包含整型字面值常量、枚举常量货用常量表达式初始化的整型const对象。非const变量及要到运行阶段才知道其值的const变量都不能用于定义数组的维数。显示初始化的数组不需要指定其维数值。没有引用类型的数组。
对初始化说两句:函数体外定义的内置数组类型,元素初始化为0;体内定义无初始化。元素类型为类类型时,默认构造函数初始化,无默认构造函数,则必须显示初始化,与数组定义位置无关。字符数组用字符串字面值初始化时,注意字符串字面值包含一个额外的空字符。再叨叨一句指针:理解指针声明语句时,请从右往左。
//以下是本文介绍的重点:
数组名----二维数组的存储----指针和二维数组的关系-----指针和数组的转换关系深入讲解
一、先说说数组名,数组名代表数组第一个元素的指针。对一维数组,数组名就代表首元素地址;对二维数组,因其元素是数组,所以数组名代表首个行地址。
对二维数组a,区分下a和a[0]:
a代表首个行地址,它的每个元素都是一个行数组,因此,它的指针移动单位是&行&。使用a[0]是把二维数组看做一个一维数组来处理,即它的元素不再是行,而是单个数组元素。所以它指向的是数组的首个元素,它的指针移动单位是&单个数组元素&。
二、二维数组在内存中如何存储:
int a[2][3]={1,2,3,4,5,6};
int m=a[0][5];//m=6
所以C++的数组在内存中是没有维数的概念的。二维数组存储时,是按照先行后列的顺序依次存储的。把每行看做一个整体,即视为一个大的数组元素。
三、指针和二维数组的对应关系:
1) 指针对应的二维数组元素地址:
int a[2][3]={1,2,3,4,5,6};
int* p=a[0];
int m=*(p+3);//m=4&&&& 即若有p=a[0](a是二维数组),则p+j指向a[0][j]。
2) 二维数组元素地址对应的指针:
int a[2][3]={1,2,3,4,5,6};
int* p=a[0];
a[i][j]=*(p+i*列数+j);或a[i][j]=p[i*列数+j];
3) 二维数组名和二维数组元素的对应关系:
用二维数组名作地址表示数组元素:二维数组a表示行元素,a+i表示第i个行元素。所以a [i] [j]用数组名表示为:*(*(a+i)+j)
4) 行数组指针:
int a[2][3]={1,2,3,4,5,6};
int** p=a;//编译错误
可以通过定义数组指针的方式,使得一个指针变量与二维数组名具有相同的性质。定义方法:int (*p)[4]=a;
区分数组指针和指针数组:数组指针是指向数组首元素的地址的指针,其本质为指针,定义为:int (*ptr_array) [10];。指针数组是数组元素为指针的数组,其本质为数组,定义为:int *ptr_array[10];。
四、深入讲解:
void function(int**array,int width,int height)
然后我们定义了一个二维数组 intp[3][3]={{1,2,3},{4,5,6},{7,8,9}};
当我们调用function时,即function(p,3,3),编译器会报错:
error C2664:'function' : cannot convert parameter 1 from int [3][3]' to int **'
数组名和指针还是有区别的。C++支持数组自动转为指针类型,但指针无法自动转换为数组类型,转换是基于从外层到内层的顺序开始转换,外层相同不再转换。
这儿为了方便讲解,先说个关系:把指针的数组认为是数组嵌套在指针外层,C++支持的转换只能从外层至内层的顺序转换,若外层相同不转换。所以,array(指针的指针)和p(数组的首元素地址,即数组首元素的指针)不能转换为同一类型。对数组指针和指针数组:指针数组可转为指针的指针,指针的指针与数组指针不同。用代码表示即:
int a[2][3];
int (*p)[2]=a;// 这个没转换,p是数组的指针,a也是
int *arr[3];
int **q=//arr是指针数组,转为指针的指针在C/C++中动态分配二维数组 - 简书
在C/C++中动态分配二维数组
在C/C++中动态分配二维数组可以先申请一维的指针数组,然后该数组中的每个指针再申请数组,这样就相当于二维数组了,但是这种方法会导致每行可能不相邻,从而访问效率比较低。如何申请连续的二维数组了?本文将分别三个方面讲解:
一.动态申请列大小固定的二维数组
二.C语言中动态申请连续的二维数组
三.C++语言中动态申请连续的二维数组
一.动态申请列大小固定的二维数组
首先如果二维数组的列大小固定,那么很简单,可以用申请一维数数组再其指针强制转化成为二维数组指针即可。详见代码:
//列大小固定的二维数组可以申请一维数据并将指针强转成二维数组
int main()
列大小固定的二维数组可以申请一维数据并将指针强转成二维数组\n");
printf(" -- by MoreWindows( http://blog.csdn.net/MoreWindows ) --\n\n");
//列值固定
const int MAXCOL = 3;
printf("请输入二维数组的行数(列值固定为%d): ", MAXCOL);
scanf("%d", &nRow);
//申请一维数据并将其转成二维数组指针
int *pp_arr = new int[nRow * MAXCOL];
int (*p)[MAXCOL] = (int(*)[MAXCOL])pp_
//为二维数组赋值
for (i = 0; i & nR i++)
for (j = 0; j & MAXCOL; j++)
p[i][j] = i +
//输出二维数组
for (i = 0; i & nR i++)
for (j = 0; j & MAXCOL; j++)
printf("]", p[i][j]);
putchar('\n');
//释放资源
delete[] pp_
运行结果如下所示:
在C/C++中动态分配二维数组
二.C语言中动态申请连续的二维数组
上面的方法虽然方便,但必须要求列的大小固定。下面先来试下在C语言中如何动态申请连续的二维数组。可以采用多申请一些指针,然后这一些指针分别指向后面数据区中对应的位置,如一个34的int类型数组,我们先申请大小为sizeof(int) * 3 + 3 * 4 * sizeof(int)的一维数组设为arr。然后arr[0]存放指向arr + sizeof(int) * 3这个位置的指针,arr[1]存放指向arr + sizeof(int) * 3 + 4 * sizeof(int)这个位置的指针, arr[2]存放指向arr + sizeof(int*) * 3 + 2 * 4 * sizeof(int)这个位置的指针。下面用图展示指向的示意:
在C/C++中动态分配二维数组
详细代码如下,由于指针操作有点小复杂,请读者耐心看:
//C语言中动态的申请二维数组 malloc free
//动态申请二维数组
template &&/span&typename T&
T** malloc_Array2D(int row, int col)
int size = sizeof(T);
int point_size = sizeof(T*);
//先申请内存,其中point_size * row表示存放row个行指针
T **arr = (T **) malloc(point_size * row + size * row * col);
if (arr != NULL)
memset(arr, 0, point_size * row + size * row * col);
T *head = (T*)((int)arr + point_size * row);
while (row--)
arr[row] = (T*)((int)head + row * col * size);
return (T**)
//释放二维数组
void free_Aarray2D(void **arr)
if (arr != NULL)
free(arr);
int main()
C语言中动态的申请二维数组 malloc free\n");
printf(" -- by MoreWindows( http://blog.csdn.net/MoreWindows ) --\n\n");
printf("请输入行列(以空格分开): ");
int nRow, nC
scanf("%d %d", &nRow, &nCol);
//动态申请连续的二维数组
int **p = malloc_Array2D&&/span&int&(nRow, nCol);
//为二维数组赋值
for (i = 0; i & nR i++)
for (j = 0; j & nC j++)
p[i][j] = i +
//输出二维数组
for (i = 0; i & nR i++)
for (j = 0; j & nC j++)
printf("M ", p[i][j]);
putchar('\n');
free_Aarray2D((void**)p);
运行结果如下:
在C/C++中动态分配二维数组
三.C++语言中动态申请连续的二维数组
可以看出我们已经成功实现了在C语言中动态申请连续的二维数组,如果上面的程序不使用int类型而使用string类这种类型,那会有什么后果了?肯定的说,由于没有调用构造函数和析构函数,程序绝对会造成内存泄露。因此要做下改进,下面给出在C++语言中动态申请连续的二维数组的代码,有些C++语法可能平时见得少,但其实这些语法在STL里面运用还是比较多的,有兴趣的童鞋应该掌握下。
//C++语言中动态的申请二维数组 new delete
//动态申请二维数组
template &&/span&typename T&
T** new_Array2D(int row, int col)
int size = sizeof(T);
int point_size = sizeof(T*);
//先申请内存,其中sizeof(T*) * row表示存放row个行指针
T **arr = (T **) malloc(point_size * row + size * row * col);
if (arr != NULL)
T *head = (T*)((int)arr + point_size * row);
for (int i = 0; i & ++i)
(T*)((int)head + i * col * size);
for (int j = 0; j & ++j)
new (&arr[i][j]) T;
return (T**)
//释放二维数组
template &&/span&typename T&
void delete_Array2D(T **arr, int row, int col)
for (int i = 0; i & ++i)
for (int j = 0; j & ++j)
arr[i][j].~T();
if (arr != NULL)
free((void**)arr);
int main()
C++语言中动态的申请二维数组 new delete\n");
printf(" -- by MoreWindows( http://blog.csdn.net/MoreWindows ) --\n\n");
printf("请输入行列(以空格分开): ");
int nRow, nC
scanf("%d %d", &nRow, &nCol);
//动态申请连续的二维数组
string **p = new_Array2D(nRow, nCol);
//为二维数组赋值
for (i = 0; i & nR i++)
for (j = 0; j & nC j++)
char szTemp[30];
sprintf(szTemp, "(第%d行,第%d列)", i, j);
p[i][j] = szT
//输出二维数组
for (i = 0; i & nR i++)
for (j = 0; j & nC j++)
printf("%s ", p[i][j].c_str());
putchar('\n');
delete_Array2D(p, nRow, nCol);
运行结果如下:
在C/C++中动态分配二维数组
我不是大咖,我只是大咖的搬运工。。。
C语言笔记 一终端命令 ls -l显示当前工作路径下的所有的文件及文件信息 d开头文件夹 -开头文件 r读 w写 x执行 - -当前用户的权限 - -其他用户的权限 & pwd查看终端程序的工作路径 &cd切换工作路径 &clear清理屏幕 &touch新建文件 &open...
指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; 能很方便地使用数组和字符串; 并能象汇编语言一样处理内存地址,从而编出精练而高效的程序。指针极大地丰富了C语言的功能。 学习指针是学习C语言中最重要的一环, 能...
(JG-)(前半部分经过网上多篇文章对比整理)(后半部分根据ExceptionalCpp、C++语言问题等书整理与一些经验) 1 概念 想要学好C++的堆栈,那么就要了解什么是C++堆栈,所为C++堆栈就是一种数据项按序排列的数据结构,只能在一端(称为栈...
C语言中内存分配 在任何程序设计环境及语言中,内存管理都十分重要。在目前的计算机系统或嵌入式系统中,内存资源仍然是有限的。因此在程序设计中,有效地管理内存资源是程序员首先考虑的问题。 第1节主要介绍内存管理基本概念,重点介绍C程序中内存的分配,以及C语言编译后的可执行程序的...
第1章 第一个C程序第2章 C语言基础第3章 变量和数据类型第4章 顺序结构程序设计第5章 条件结构程序设计第6章 循环结构程序设计第7章 数组第8章 指针第9章 函数第10章 结构型、共用型、枚举型及用户自定义型数据第12章 文件第14章 预处理宏命令 第1章 第一个C程...
抱怨挺好的,可以释放自己的情绪!但是不能解决任何问题! 真的自己静下来,问自己的内心,为什么抱怨?可能自己再静的心,也弄不明白自己为什么那么做了,为什么说了那样的话,为什么用了那样的口气。 然而,一切抱怨都那么自然的发生了,就像花儿喜欢阳光,小草喜欢朝露一样,好像是一个很自...
随着iphone每年的更新换代,作为ios程序猿也有了幸福的烦恼,不得不考虑各种屏幕的适配。首先,我们从iphone的历史说起,初代iphone(iphone 3GS)屏幕320 x 480 像素。那个时候也只是支持绝对定位。比如一个按钮(x, y, width, heig...
日本航空公司不仅仅是日本,也是亚洲地区最大的航空公司。自从1951年成立以来,这家航空公司不断开拓国际航线,架起了一座座连接亚洲与世界各地的空中桥梁,经营的国际航线多达34个国家,158个机场。但是日航不得不走进东京地方法院,提出了破产申请。据悉负债金额高达2万亿日元(约1...
大年初一,奶奶对星宇说:“给我磕个头,我给你个大红包。”星宇走过去,扶住奶奶的肩膀,用自己的额头磕了奶奶的额头一下。
临摹心蓝丫头的作品。画着画着发现买错了纸,再仔细看看画本是水彩簿,画水彩用的。晕,试了一下反面画画。效果如下: (捂脸)我不敢说我是一个曾经会画景观图的学生了。

我要回帖

更多关于 c语言存储区域 的文章

 

随机推荐