上机实验十 指针与数组

合集下载

C语言教材第七章指针实验

C语言教材第七章指针实验

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]。

C++实验报告一 数组与指针

C++实验报告一   数组与指针

实验一数组与指针【实验目的】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语言数组与指针详解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语言数组与指针实验心得

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)。

C语言-指针与数组

C语言-指针与数组

指针与数组一、指针与一维数组数组名的实质——地址常量用指针访问一维数组的两种方式函数定义中指针形参与数组名实参对应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);八、指向函数的指针//完全匹配模式类型标识符(*函数指针名)(形参表);//简单形式类型标识符(*函数指针名)();。

C_lab6-2_指针与一维数组.

C_lab6-2_指针与一维数组.

实验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语言程序设计-指针与数组
5)就是a[5]。 3. 下标法,即用a[i]形式访问数组元素。 4. 指针法,即采用*(p+i)或*(a+i)的形式,用间接访问的方法来访问
数组元素,其中a是数组名,p是指向数组的指针变量,其值为数组 的首地址。
2 指针与数组
程序举例
【例8.3】使用指针法输出数组中的全部元素 main() {
int a[5],i,*p; p=a; for(i=0;i<5;i++)
指针与数组
2 指针与数组
➢ 一个变量有一个地址,一个数组包含若干元素,每个数组元素都在内 存中占用存储单元,它们都有相应的地址。所谓数组的指针就是指数 组的起始地址(首地址),数组元素的指针则是数组元素的地址。
➢ 指向数组的指针 一个数组占用一段连续的内存单元,数组名即为这段连续内存单元的
首地址,一个数组元素的地址就是它所占用的几个连续内存单元的首地 址。
*(p+i)=i; for(i=0;i<5;i++);
printf("a[%d]=%d \n",i,*(p+i); }
谢谢观看
Байду номын сангаас
2 指针与数组
定义一个指向数组元素的指针变量的方法: int a[10]; int *p; p=&a[0];
下面两个语句等价:p=&a[0]; p=a;
通过指针引用数组元素如果指针变量p指向数组中的一个元素,则p+1 指向同一数组中的下一个元素。
2 指针与数组
如果p的初始值为&a[0],则: 1. p+i和a+i就是a[i]的地址,或者说它们指向a数组的第i个元素。 2. *(p+i)或*(a+i)就是p+i或a+i所指向的数组元素,即a[i]。如*(p+

C++程序设计实验报告-数组、指针与字符串

C++程序设计实验报告-数组、指针与字符串
int i,j,t; for(i=0;i<3;i++)
for(j=0;j<i;j++) {
t=b[i][j]; b[i]]=t; } } int main() { int (*a)[3]=new int[3][3]; int i,j; cout<<"请输入 3x3 矩阵:"<<endl; for(i=0;i<3;i++) for(j=0;j<3;j++)
cin>>a[i][j]; zhuanzhi(a); cout<<"转置后的矩阵为:"<<endl; for(i=0;i<3;i++) {
for(j=0;j<3;j++) cout<<a[i][j]<<" ";
cout<<endl; } delete[] a; return 0; } 运行结果:
(3)编程实现两字符串的连接。要求使用字符数组保存字符串,不要使用 系统函数。 源程序代码: #include<iostream> using namespace std;
int main() {
char str1[100],str2[100],str[200]; int i,j; cout<<"请输入第一个字符串:"; cin>>str1; cout<<"请输入第二个字符串:"; cin>>str2; for(i=0;str1[i]!='\0';i++)
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

上机实验十指针与数组
学号: 姓名:
一、目的要求:
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函数,不得增行或删行,也不得更改程序的结构。

相关文档
最新文档