上机实验十 指针与数组
- 格式:doc
- 大小:31.00 KB
- 文档页数:2
C语⾔教材第七章指针实验第七章指针第⼀部分知识训练【知识要点】1. 地址与指针指针变量的概念:⽤⼀个变量专门来存放另⼀个变量的地址。
2. 指向变量的指针变量指针变量的形式:基类型 *指针变量名;&: 取地址运算符;*:指针运算符。
3. 指针与数组引⽤⼀个数组元素可以⽤下标法和指针法;可以⽤数组名作函数的参数。
4.指针与函数函数指针变量定义的⼀般形式为:类型说明符 (*指针变量名)();⼀个函数的返回值可以是⼀个函数。
【典型习题与解析】5. char * const p;char const * pconst char *p上述三个有什么区别?【解析】char * const p; //常量指针,p的值不可以修改;char const * p;//指向常量的指针,指向的常量值不可以改;const char *p; //和char const *p。
6. main(){int a[5]={1,2,3,4,5};int *ptr=(int *)(&a+1);printf("%d,%d",*(a+1),*(ptr-1));}输出结果是什么?【解析】答案:输出:2,5*(a+1)就是a[1],*(ptr-1)就是a[4],执⾏结果是2,5。
&a+1不是⾸地址+1,系统会认为加⼀个a数组的偏移,是偏移了⼀个数组的⼤⼩(本例是5个int)。
1)&a是数组指针,其类型为 int (*)[5];⽽指针加1要根据指针类型加上⼀定的值,不同类型的指针+1之后增加的⼤⼩不同。
2)a是长度为5的int数组指针,所以要加 5*sizeof(int),所以ptr实际是a[5],但是prt与(&a+1)类型是不⼀样的(这点很重要),所以prt-1只会减去sizeof(int*) a,&a的地址是⼀样的,但意思不⼀样。
3)a是数组⾸地址,也就是a[0]的地址,&a是对象(数组)⾸地址,a+1是数组下⼀元素的地址,即a[1],&a+1是下⼀个对象的地址,即a[5]。
实验一数组与指针【实验目的】1.准确理解数组和指针的定义,合理运用数组和指针解决问题2.熟练掌握一维数组、二维数组的运用方法3.熟练掌握指针运算符&和*【实验内容】1.写一个程序,要求用户输入10个数据到数组中,然后将数组中的最大值和最小值显示出来,同时显示其下标。
#include<iostream>#include<iomanip>using namespace std;int main(){inti,m,n,a[10],max,min;for(i=0;i<10;i++)cin>>setw(5)>>a[i];cout<<endl;min=max=a[0];for(i=0;i<10;i++){if(a[i]<min){min=a[i];m=i;}if(a[i]>max){max=a[i];n=i;}}cout<<setw(6)<<"min="<<min<<setw(6)<<"下标为:"<<m<<endl;cout<<setw(6)<<"max="<<max<<setw(6)<<"下标为:"<<n<<endl;return 0;}4编写程序,让用户输入一个账号,检验该账号是否出现在下面的列表中。
如果属于下面列表中的账号,则输出合法信息,否则输出非法信息。
采用现行查找法。
5658845,4520125,7895122,8777541,8451277,1302850,8080152,4562555,5552012, 5050552,7825877,1250255,1005231,6545231,3852085,7576651,7881200,4581002 #include<iostream>using namespace std;constint a=18;int s(int L[],intn,int v);int main(){intt[a]={5658845,4520125,7895122,8777541,8451277,1302850,8080152,4562555,5552 012,5050552,7825877,1250255,1005231,6545231,3852085,7576651,7881200,45810 02};intresult,x;cin>>x;result=s(t,a,x);if(result==-1)cout<<x<<"为非法信息"<<endl;elsecout<<x<<"为合法信息"<<endl;return 0;}int s(int L[],intn,int v){for(int i=0;i<n;i++)if(v==L[i])return i;return -1;}5.采用二分查找的方法实现上述程序。
C语言数组与指针详解C语言数组与指针详解由于数据的表现形式多种多样,还有字符型和其它的数值类型,因此仅有基本数据类型是不够的。
是否可以通过基本数据类型的组合抽象构造其它的数据类型呢?下面是店铺为大家带来的C语言数组与指针详解的知识,欢迎阅读。
1.数组(1)数组的声明我们知道,一个基本数据类型的变量只能存储一个数据,比如:int data = 0x64;如果需要存储一组int型数据呢?比如,1、2、3,则至少需要3个变量data0、data1、data2。
比如:int data0 = 1, data1 = 2, data2 =3;由于数据的表现形式多种多样,还有字符型和其它的数值类型,因此仅有基本数据类型是不够的。
是否可以通过基本数据类型的组合抽象构造其它的数据类型呢?答案是可以的,构造数据类型数组就是这样产生的。
从概念的视角来看,int型整数1、2和3都是相同的数据类型,data0、data1和data2三个变量的共性是data,其差异性是下标不一样。
因此可以将data0、data1和data2抽象为一个名字,然后用下标区分这些变量的集合——data[0]、data[1]和data[2]。
如果有以下声明:intdata[3]; //解读为data是int数组(元素个数3)那么data[3]就成了存放3个int型数据1、2、3的data[0]、data[1]和data[2]所组成的数组,即可分别对data[0]、data[1]和data[2]赋值:data[0] = 1, data[1] =2, data[2] = 3;当然,也可以按照以下方式声明一个数组并进行初始化:intdata[3] = {1, 2, 3};通常将data称为数组(变量)名,data[0]、data[1]和data[2]被称为变量。
因而可以说,数组是将相同类型数据的若干变量按有序的形式组织起来,用一个名字命名,然后用下标区分这些变量的集合。
c语言数组与指针实验心得
C语言的数组和指针一直是两个容易混淆的东西,当初在学习的时候,也许为了通过考试会对指针和数组的一些考点进行突击,但是很多极其细节的东西也许并不是那么清楚。
本篇侧重点在于分析数组与指针的关系,什么时候数组可以等同于指针,什么时候二者不同。
我们常常把指针和数组混淆,比如以下这种情况,定义为指针,却使用了数组的方式来取值。
char*p="pointertest";
c=p[i];
定义为指针,但是使用数组的方式来取值。
我们可以结合以上两种方式,来分析这种情况下的取值过程:
1.先根据符号p的地址,取到符号p的值,是一个地址,我们假设为4040,也就是和上面第二种情况的指针访问一样。
2.接下来就是4040+i,得到新的地址值
3.取新的地址的内容
同理,取偏移地址的时候,需要注意变量类型,比如int类型,就是加上i*4
以下对于二者可相互替换做一个总结
(1)externchara[];通过extern声明的数组,不能用指针形式替换
(2)数组定义为chara[5],不能用指针的形式替换
(3)数组作为函数参数,可以使用指针形式替换
(4)在表达式中,比如c=a[i],这种情况也可以使用指针形式来替换,因为在表达式中,数组名a被当做指向该数组第一个元素的指针,所以可以和指针相互替换。
而且数组下标i可以和指针的偏移量等同起来,a[i]等同于*(a+i)。
指针与数组一、指针与一维数组数组名的实质——地址常量用指针访问一维数组的两种方式函数定义中指针形参与数组名实参对应1. a+i==&a[i]——a+i 没有修改a ,是正确的表达式2. 间接访问:*(a+i)元素取地址法:a[i]3. a 是数组名,是一个地址常量,不可以改变4. p 是指针,是一个变量,可以改变二、指针访问一维数组1. 在p=score;后,用指针访问一维数组所有元素有两种方法:2. 用一个for 循环就行3. 一维数组名是指针常量,可以赋值给基类型相同的指针变量,使指针变量可以访问数组所在的存储空间三、指针与二维数组二维数组是一维数组的一维数组二维数组中的地址分为行地址和列地址二维数组中存在的三种类型1. 列地址——>二维数组元素(加*)2. 二维数组元素——>列地址(加&)3. 行地址与本行0列地址转化规律同上四、行地址与列地址行指针定义格式int score [N ]={1,2,3,4};int *p ;p =score ;a //二维数组的首地址,存放行地址a +i //存放第i 行的地址*(a +i ) //即a[i] 存放第i 行第0列的地址*(a +i )+j //即a[i]+j 存放第i 行第j 列的地址*(*(a +i )+j ) //即a[i][j] 存放第i 行第j 列的元素类型标识指示符 (*指针变量名)[整型常量表达式];五、指针与函数传值/传地址六、常量指针和指针常量常量指针——>指向可以改,值不能改指向可以改(懂?)指针常量——>值可以改,指向不能改七、指针与动态空间#include<stdilb.h>void*malloc(unsigned size); //初始值随机void*calloc(unsigned NumElements,unsigned SizeOfElements)//初始值为0实际调用时需要强制转换类型int*pa=(int*)malloc(n*sizeof(int));int*pa=(int*)calloc(n,sizeof(int));if (p==NULL){printf("NO ENOUGH MEMORY\n");exit(0);}free(p);八、指向函数的指针//完全匹配模式类型标识符(*函数指针名)(形参表);//简单形式类型标识符(*函数指针名)();。
实验6-2指针与一维数组【实验目的】1. 正确认识指针与数组的关系。
2. 掌握如何利用指针变量控制对数组的各种操作【实验内容】Part1:基础练习(课堂练习)1. C语言中,数组名是一个不可改变的地址,不能对它进行赋值运算。
数组在内存中占用一段连续的存储空间,它的首地址由数组名表示。
2. 若有以下声明和语句,则++(*p的值是 2 ,*--p的值是 0 。
int a[4] ={0,1,2,3}, *p;p=&a[1];3. 若有定义:int a[]={2,4,6,8,10,12}, *p=a;则*(p+1的值是 4 ,*(a+5的值是12 。
4. 以下程序段通过移动指针变量m,将下图所示连续动态存储单元的值,从第一个元素起,输出到终端屏幕,请填空(假设程序段中的所有变量均已正确说明)。
for(m=q; m-q<10;printf(“%3d”, *m++ ;5. 以下程序段通过指针变量q,给下图所示连续动态存储单元赋值(此过程中不能移动q),请填空(假设程序段中的所有变量均已正确说明)。
for( k=0;k<10;k++scanf(“%d”, q+k ;6. 以下程序段通过移动指针变量m,给下图所示连续动态存储单元赋值,请填空(假设程序段中的所有变量均已正确说明)。
for(m=q; mscanf(“%d”, m++ ;7. 若数组m如下所示,则数组元素m[m[4]+m[8]]的值是 8 ,*m+m[9]的值是12 。
m[*(m+4]的值是 12 。
8. 若有声明如int x[10], *p=x; 则在程序中引用数组元素x[i]的四种形式是: *(p+i ,*(x+i , p[i] , x[i]。
9. 下面程序的运行结果是sum=25 。
Part2:巩固提高(课后实践)1. 若有声明int a[10], *p=a; 则p+5表示 A ,*(p+5表示 B 。
A. 元素a[5]的地址B. 元素a[5]的值C.元素a[6]的地址 D. 元素a[6]的值2. 若已有声明char s[10]; 则在下面表达式中不表示s[1]的地址的是 B 。
C语言中的数组与指针详解C语言是一门广泛应用于系统软件、嵌入式软件和应用软件开发的高级编程语言。
其中,数组和指针是C语言中常用的数据类型和概念。
在本文中,我们将详细讨论C语言中的数组和指针,包括它们的定义、使用方式以及相关的特性和技巧。
一、数组(Arrays)数组是一种用于存储多个相同类型元素的连续内存区域的数据结构。
C语言中的数组可以存储基本数据类型(如整数和字符)或自定义的数据类型(如结构体)。
数组的定义使用方括号([])来表示,并指定数组的大小。
例如,下面的代码片段展示了如何声明和初始化一个整型数组:```cint numbers[5] = {1, 2, 3, 4, 5};```在这个例子中,我们定义了一个名为numbers的整型数组,它有5个元素并初始化为{1, 2, 3, 4, 5}。
可以使用索引(index)来访问数组中的元素,索引从0开始。
数组在C语言中具有以下特点和技巧:1. 数组名即为指向数组首元素的指针。
可以使用指针运算对数组进行操作。
2. 数组的大小在编译时就确定了,并且不能动态改变。
3. 数组的元素在内存中是连续存储的,可以通过指针算术运算实现遍历和访问。
4. 数组名作为函数参数传递时会自动转换为指针。
二、指针(Pointers)指针是C语言中另一个重要的概念,它用于存储变量的内存地址。
指针变量可以指向任何数据类型,包括基本数据类型和复合数据类型。
通过指针,我们可以直接访问和修改内存中的数据。
在C语言中,可以通过使用感叹号(*)来声明指针变量。
例如,下面的代码片段展示了如何声明一个指向整型变量的指针:```cint *ptr;```在这个例子中,我们声明了一个名为ptr的指针变量,它可以指向整型变量。
我们可以使用取地址运算符(&)来获取变量的内存地址,并将其赋值给指针变量。
指针在C语言中具有以下特点和技巧:1. 可以使用指针间接访问和修改变量的值。
2. 可以通过指针传递变量的引用,从而实现函数间的数据传递。
《测绘程序设计()》上机实验报告(Visual C++.Net)实验3 数组、指针与函数班级:学号:姓名:序号:二零一零年三月实验3 数组、指针与函数一、实验目的∙掌握数组的定义、引用及应用方法。
∙掌握指针与动态数组。
∙掌握函数的定义、引用及应用方法。
二、实验内容1.求任意多边形面积多边形面积计算原理及算法计算原理:例如上图:))((21))((21))((21))((214114344323321221y y x x y y x x y y x x y y x x P -++-++-++-+=面积计算的算法:经整理后得:)11,,2,1())((21111=+==-+=∑=++i n i n i Y Y X X P ni i i i i 时,;当设计思路:因为计算多边形面积的数据随多边形顶点数的增加而增加,因此要编写一个分割字符串的函数,使输入的数据第一行表示多边形类型,接下来的每一行依次表示一个顶点的坐标,X 与Y 之间用逗号隔开。
创建一个二维数组,行数即顶点个数,列数为2,用来保存各顶点的坐标。
调用Split 函数分离,获取各顶点坐标数据 界面设计:由1个静态框、2个文本框和2个命令按钮组成。
具体见运行结果的输出界面主要代码:ComAreaDlg.cppvoid CComAreaDlg::OnBnClickedCancel(){// TODO: 在此添加控件通知处理程序代码OnCancel();}CString * CComAreaDlg::SplitString(CString str, char split, int& iSubStrs){int iPos = 0; //分割符位置int iNums = 0; //分割符的总数CString strTemp = str;CString strRight;//先计算子字符串的数量while (iPos != -1){iPos = strTemp.Find(split);if (iPos == -1){break;}strRight = strTemp.Mid(iPos + 1, str.GetLength());strTemp = strRight;iNums++;}if (iNums == 0) //没有找到分割符{//子字符串数就是字符串本身iSubStrs = 1;return NULL;}//子字符串数组iSubStrs = iNums + 1; //子串的数量= 分割符数量+ 1CString* pStrSplit;pStrSplit = new CString[iSubStrs];strTemp = str;CString strLeft;for (int i = 0; i < iNums; i++){iPos = strTemp.Find(split);//左子串strLeft = strTemp.Left(iPos);//右子串strRight = strTemp.Mid(iPos + 1, strTemp.GetLength()); strTemp = strRight;pStrSplit[i] = strLeft;}pStrSplit[iNums] = strTemp;return pStrSplit;}void CComAreaDlg::OnBnClickedButton1(){// TODO: 在此添加控件通知处理程序代码UpdateData(TRUE);int iLine;//分行并存入字符串数组CString *pstrLine=SplitString(strCoordData,13,iLine);if(iLine<4){MessageBox(_T("输入的数据不完整!"));return;}int iApexCount=iLine-1;//多边形顶点个数short npolygonType;//多边形类型,double (*cApex)[2];cApex=new double[iApexCount][2];//顶点坐标值CString *strTmp=NULL;int n;npolygonType = _ttoi(pstrLine[0]); //第一行为多边形类型//逐行用Split函数分离,获取各顶点坐标数据for(int i=0;i<iApexCount;i++){strTmp = SplitString(pstrLine[i+1], ',',n);//分割第三行cApex[i][0] = _tstof(strTmp[0]);cApex[i][1] = _tstof(strTmp[1]);if(strTmp!=NULL)//释放内存{delete[] strTmp;strTmp=NULL;}}if(strTmp!=NULL)//释放内存{delete[] strTmp;strTmp=NULL;}double Area=0.0;//多边形面积for(int i=0;i<iApexCount;i++){if(i==iApexCount-1){//i+1=0;Area = Area+(0.5)*(cApex[0][0]+cApex[i][0])*(cApex[0][1]-cApex[i][1]);}elseArea = Area+(0.5)*(cApex[i+1][0]+cApex[i][0])*(cApex[i+1][1]-cApex[i][1]); //计算面积}//输出结果strResult.Format(_T("%s%.1fmm\r\n"),_T("面积S=:"),Area);//_T("序号 "),_T("调整后H (m) "));UpdateData(FALSE);//释放内存if(cApex!=NULL){delete [] cApex; cApex=NULL;}}运行结果:2.由三角形三个边长求内角函数计算公式: bc ac b A 2cos 222-+=ac bc a B 2cos 222-+=abcb a C 2cos 222-+=设计思路:已知三角形三个边长求三角形三个内角算法简单,需要的数据也少,顺序结构即可实现。
上机实验十指针与数组
学号: 姓名:
一、目的要求:
1.了解或掌握指针与数组的关系,指针与数组有关的算术运算、比较运算。
2.了解或掌握运用指针处理数组。
二、实验内容:
第1题、分别用下标法和指针变量p访问数组a[5]={1,3,5,7,9},至少用三种方法输出数组各元素的值,每种方法输出的五个元素在一行上。
第2题、书上P211例10-4。
并仔细体会P212“使用指针实现数组元素逆序存放”的指针移动思想。
第3题、编写程序,使用指针实现逆序打印一维整型数组所有元素的操作。
数组a: 1 3 7 2 9 6 5 8 2 0 4 8 2 0 4
第4题、书上P213冒泡排序。
第5题、编写一个函数s(a,n),其中a是一个指向整型的指针接受一维整型数组首地址,n 是数组长度,功能是通过指针求数组中元素的平均值,并编写主函数测试函数。
第6题、编写一个函数void sort(int *a, int n), 用选择法对数组a中的元素按降序排序。
在main()函数中输入10个数,调用sort函数排序后,然后输出。
第7题、使用指针把从键盘输入的2个数按从大到小的顺序输出(不改变变量的值),请补充完整并上机调试。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
第8题、输入10个整数存入一维数组,然后逆置数组,最后输出。
下面给出部分程序的内容,请将程序补充完整,然后上机调试。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
第9题、上机调试下面程序,看哪些程序实现了交换主函数中两个变量值的操作,哪些没有实现,并分析原因。
第10题、调试修改下面程序,函数fun的功能是:在含有10 个元素的s数组中查找最大数,及最大数所在位置(即,下标值),最大数可能不止一个。
最大数作为函数值返回,最大数的个数通过指针变量n传回,所在位置由数组pos传回。
例如:
若输入 2 8 5 7 8 4 5 3 2 8
则应输出:The max: 8
The positions:1 4 9
请改正函数fun中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。