练习6-指针与一维数组ans
- 格式:doc
- 大小:62.50 KB
- 文档页数:3
编程题1用指向数组的指针变量输出数组的全部元素#include<iostream.h>void main( ){ int a[10], i;int *p;for (i=0; i<10; i++)cin>>a[i];for (p=a; p<a+10; p++)cout<<*p<<‘\t’;}#include<iostream.h>void main( ){ int a[10], i;int *p=a;for (i=0; i<10; i++)cin>>a[i];for (i=0; i<10; i++)cout<<*p++<<‘\t’;}2 使用函数调用,形参为指针,实参为数组,把一个数组逆序存放在输出#include<iostream.h>void inv(int *x, int n);void main( ){ int i, a[10]={3,7,9,11,0,6,7,5,4,2};inv(a,10);for (i=0;i<10; i++)cout<<a[i]<<‘\t’;}void inv(int *x, int n){ int *p, t, *i, *j, m=(n-1)/2;i=x; j=x+n-1; p=x+m;for (; i<=p; i++,j--){ t=*i; *i=*j; *j=t;}}void inv(int x[ ], int n){ int t, i, j, m=(n-1)/2;for (i=0;i<=m; i++){ j=n-1-i;t=x[i]; x[i]=x[j]; x[j]=t;}}一判断题× 1.指针是变量,它具有的值是某个变量或对象的地址值,它还具有一个地址值,这两个地址值是相等的。
指针和一维数组经典题目
下面是一些经典的指针和一维数组题目:
1. 求一个一维数组的和、平均值、最大值、最小值。
2. 将一个一维数组元素逆序存放。
3. 合并两个有序的一维数组为一个新的有序数组。
4. 将一个一维数组中的奇数和偶数分别放在两个新的一维数组中。
5. 给定一个一维数组和一个目标值,判断目标值是否存在于数组中。
6. 给定一个一维数组和一个目标值,查找目标值在数组中的索引。
7. 统计一个一维数组中0的个数。
8. 对一个一维数组进行冒泡排序或选择排序。
9. 将一个一维数组循环右移k位。
10. 判断一个一维数组是否为回文数组。
这些题目可以帮助您巩固指针和一维数组的基本操作,同时也可以提高您的编程能力。
指针★指针的重要性表示一些复杂的数据结构快速传递数据使函数返回一个以上的值能直接访问硬件能方便处理字符串是理解面向对象语言中引用的基础总结:指针是C 语言的灵魂★指针的定义 ☆地址内存单元的编号 从零开始的非负整数 范围:4G ☆指针1.指针就是地址,地址就是指针2.指针变量是存放地址的变量3.指针和指针变量是两个不同的概念4.叙述时通常把指针变量简称为指针,实际它们含义不一样5.指针的本质就是一个操作受限的非负整数 ★指针的分类☆基本类型指针(重要) #include<stdio.h> int main(void)Int f(int i,int j){return 100;// return 88;error }Int main (void){Int a=3,b=5;# include <stdio.h> Void g(int*p,int*q){*p=1;*q=2; } Int main(void) {Int a=3,b=5;{int *p; //p是变量的名字,int*表示p变量存放的是int类型变量的地址Int*p;不表示定义了一个名字叫做*p的变量Int*p;应该理解为:p是变量名,p变量的数据类型是int*类型所谓int*类型,实际就是存放int变量地址的类型int i=3;char ch=’A’p=&i; //OK1.p保存了i的地址,因此p指向i2.p不是i,i也不是p,修改p的值不影响i的值,修改i的值也不影响p的值3.如果一个指针变量指向了某个普通变量,则*指针变量完全等同于普通变量例:若p指向i,则*p=i (*p和i 可互相替换)p=&ch;//error//p=i; //error,因为类型不一致,p只能存放int类型变量的地址,不能存放int类型变量//P=55;//error,原因同上return 0;}△附注:?*的含义:1.乘法2.定义指针变量Int*p; //定义了一个名字叫做p的变量,int*表示p只能存放int变量的地址3.指针运算符该运算符放在已经定义好的指针变量的前面如果p是一个已经定义好的指针变量则*p 表示以p 的内容为地址的变量 ?如何通过被调函数修改主调函数普通变量的值 1.实参必须为该普通变量的地址 &... 2.形参必须为指针变量 *...3.在被调函数中通过 *形参名=...... 的方式就可以修改主调函数相关变量的值 例子: 经典指针程序:互换数值形参和实参是不同的变量,修改形参不会改变实参 ?指针常见错误 #include<stdio.h> Int main(void) { Int i=5; Int*p; Int*q; P=&i;//*q=p;//error 语法编译会出错 //*q=*p;//errorP=q;//q 是垃圾值,q 赋给p ,p 也是垃圾值 printf(“%d\n ”,*q); //13行/*q 的空间是属于本程序的,所以本程序可以读写q 的内容,但是如果q 内部是垃圾值,则本程序不能读写*q 的内容因为此时*q 所代表的内存单元的控制限权并没有分配给本程序 所以本程序运行到13行时就会立即出错*/ return 0;#include<stdio.h>void huhuan (int a, int b ) { int t; t=a; a=b; b=t; return; }int main(void) { int a=3; int b=5;huhuan(a,b);#include<stdio.h> void huhuan2(int *p, int *q ) {int *t;//如果要互换p 和q 的值, 则t 必须是int*,不能是int t=p; p=q; q=t; return;}int main(void){int a=3;int b=5; #include<stdio.h>void huhuan3(int *p, int*q ) //形参的名字是p 和q ,接收实参数据的是p 和q ,而不是*p 和*q{int t;//如果要互换*p 和*q 的值, 则t 必须是int ,不能是int* t=*p;//p 是int*,*p 是int *p=*q; *q=t; return; }int main(void) {int a=3;int b=5;}☆指针和数组△指针和一维数组 ?一维数组名一维数组名是个指针常量它存放的是一维数组第一个元素的地址 ?下标和指针的关系如果p 是个指针变量,则p[i]永远等价于*(p+i) ?确定一个一维数组需要几个参数(如果一个函数要处理一个一维数组,则需要接收该数组的哪些信息) 需要两个参数:数组第一个元素的地址 数组的长度?指针变量的运算 指针变量不能相加,不能相乘,不能相除 可以相减(仅当两个指针变量指向的是同一块连续空间中的不同存储空间) ?一个指针变量到底占几个字节 预备知识: sizeof (数据类型)功能:返回值就是该数据类型所占的字节数例子:sizeof (int )=4 sizeof (char )=1 sizeof (double )=8 # include<stdio.h>//f 函数可以输出任何一个一维数组的内容 void f(int * pArr, int len) { int i ; for(i=0,i<len,++i) printf( “%d ”,*(pArr+i) ) //*(pArr+i)等价于pArr[i] b[i] *(b+i) int main(void){ int a[5]={1,2,3,4,5}; int b[6]={-1,-2,-3,4,5,-6};int c[100]={1,99,22,33}; f(a,5);//a 是int*f(b,6); 1 2 3 4 5 -1 -2 -3 4 5 -61 99 22 33 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 # include<stdio.h>void f(int * pArr,int len) { pArr[3]=88; //10行} int main(void) { int a[6]={1,2,3,4,5,6} printf(“%d\n ”,a[3]); //17行 f(a,6); printf(“%d\n ”,a[3]); //19行 若写为&a[3]则输出结果为a[3]的地址 #include<stdio.h> Int main(void){ int i=5;Int j=10; Int*p=&i; #include<stdio.h> Int main(void) { int i=5; Int j=10; Int*p=&i; Int*q=&j; Int a[5]; p=&a[1];#include<stdio.h>Void f(int*pArr,int len){ pArr[2]=10; //pArr[2]==*( pArr+2)==*(a+2)==a[2]}Int main(void) { int a[6]={1,2,3,4,5,6} printf(“%d\n ”,a[2]);f(a,5);printf(“%d\n ”,a[2]); //a=&a[2];//error 因为a 是常量# include<stdio.h> Void OutArr(int*pArr,int len) {Int i; For(i=0;i<len;++i)Printf(“%d\n ”,pArr[i]);}Int main(void) { OutArr(a,5);Return 0; }sizeof (变量名)功能:返回值是该变量所占的字节数 假设p 指向char 类型变量(1个字节) 假设q 指向int 类型变量(4个字节) 假设 r 指向double 类型变量(8个字节)△指针和二维数组☆指针和函数 ☆指针和结构体 ☆多级指针 专题:动态内存分配(重难点)传统数组的缺点:1.数组长度必须事先制定,且只能是常整数,不能是变量。
【C语⾔】-指向⼀维数组元素的指针本⽂⽬录说明:这个C语⾔专题,是学习iOS开发的前奏。
也为了让有⾯向对象语⾔开发经验的程序员,能够快速上⼿C语⾔。
如果你还没有编程经验,或者对C语⾔、iOS开发不感兴趣,请忽略前⾯我们已经学习了指针,如果指针存储了某个变量的地址,我们就可以说指针指向这个变量。
数组及其数组元素都占有存储空间,都有⾃⼰的地址,因此指针变量可以指向整个数组,也可以指向数组元素。
⼀、⽤指针指向⼀维数组的元素1// 定义⼀个int类型的数组2int a[2];34// 定义⼀个int类型的指针5int *p;67// 让指针指向数组的第0个元素8 p = &a[0];910// 修改所指向元素的值11 *p = 10;1213// 打印第⼀个元素的值14 printf("a[0] = %d", a[0]);输出结果:,说明已经通过指针间接修改了数组元素的值,跟指向⼀个普通int类型变量是⼀样的。
由于数组名代表着数组的⾸地址,即a == &a[0],因此第8⾏代码等价于:// 让指针指向数组的第0个元素p = a;内存分析图如下,⼀个指针变量占⽤2个字节,⼀个int类型的数组元素占⽤2个字节⼆、⽤指针遍历数组元素1.最普通的遍历⽅式是⽤数组下标来遍历元素1// 定义⼀个int类型的数组2int a[4] = {1, 2, 3, 4};34int i;5for (i = 0; i < 4; i++) {6 printf("a[%d] = %d \n", i, a[i]);7 }输出结果:2.接下来我们⽤指针来遍历数组元素先定义⼀个指针,指向数组的第⼀个元素// 定义⼀个int类型的数组int a[4] = {1, 2, 3, 4};// 定义⼀个int类型的指针,并指向数组的第0个元素int *p = a;p的值是a[0]的地址,因此,现在我们利⽤指针p只能访问数组的第0个元素a[0],⽤*p就可取出a[0]的值1。
第六章数组、指针与字符串6-1 数组a[10][5][15]一共有多少个元素?解:10*5*15=750个元素6-2 在数组a[20]中第一个元素和最后一个元素是哪一个?解:第一个元素是a[0],最后一个是a[19]6-3 用一条语句声明一个有5个元素的int型数组,并依次赋予1~5的初值。
解:int integerArray[5]={1,2,3,4,5}6-4 已知有一个数组名叫oneArray,用一条语句求出其元素的个数。
解:int nArrayLength=sizeof(oneArray)/sizeof(oneArray[0]);6-5 用一条语句声明一个有5×3个元素的二维int型数组,并依次赋予1~15的初值。
解:int theArray[5][3]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};6-6 运算符“*”和“&”的作用是什么?解:*是指针运算符,是一元操作符,表示指针所指向的对象的值。
&是取地址运算符,也是一个一元运算符,用来得到一个对象的地址。
6-7 什么叫做指针?指针中储存的地址和这个地址中的值有何区别?解:指针是一种数据类型,具有指针类型的变量称为指针变量。
指针变量存放的是另外一个对象的地址,这个地址中的值就是另一个对象的类容。
6-8 声明一个int型指针,用new语句为其分配包含10个元素的地址空间。
解:int pInteger=new int[10];6-9 在字符串”Hello,world!”中结束符是什么?解:\06-10 声明一个有5个元素的int型数组,在程序中提示用户输入元素值,最后再在屏幕上显示出来。
解:#include<iostream>using namespace std;int main(){int myArray[5];int i;for(i=0;i<5;i++){cout<<"Value for my Array["<<i<<"]:";cin>>myArray[i];}for(i=0;i<5;i++)cout<<i<<":"<<myArray[i]<<endl;return 0;}6-11 引用和指针有何区别?何时只能使用指针而不能使用引用?解:引用是一个别名,不能为NULL值,不能被重新分配;指针是一个存放地址的变量。
数组指针01:逆序输出从键盘输入n个整数(n<100),存放在一个一维数组中,逆序输出能被3整除的元素,并逆序输出数组下标为3的倍数的元素。
输入格式:第一个整数为个数n,后续为n个整数输出格式:第一行能被3整除的元素,第二行为下标为3的倍数的元素,各个数值之间用空格分隔。
输入:10 2 7 9 10 5 4 3 6 8 20输出:6 3 920 3 10 2#include <iostream>using namespace std;const int MAX=100;int main(){int a[MAX],n,i;cin>>n;for(i=0;i<n;i++)cin>>a[i];for(i=n-1;i>=0;i--)if(a[i]%3==0)cout<<a[i]<<" ";cout<<endl;for(i=n-1;i>=0;i--)if(i%3==0)cout<<a[i]<<" ";cout<<endl;return 0;}数组指针02:逆序存储从键盘输入n (n<100)个整数,存放在一个一维数组a中,将它们逆序存放在另一个整型数组b中,并按b数组中下标从小到大的顺序输出下标为3的倍数的数组元素。
输入格式:第一个数为数组中元素个数n,之后为n个元素输出格式:下标为3的倍数的元素,各个数值之间用空格分隔输入:10 2 7 9 10 5 4 3 6 8 20输出:20 3 10 2#include <iostream> using namespace std; const int MAX=100; int main(){int a[MAX],b[MAX],n,i; cin>>n;for(i=0;i<n;i++){cin>>a[i];b[n-1-i]=a[i];}for(i=0;i<n;i++)if(i%3==0)cout<<b[i]<<" ";cout<<endl;return 0;}数组指针03:平均值从键盘输入任意个整数(以0结束,假设不超过100个),存放在一个一维数组中,计算这组数的平均值(实型) 。
C++实验十四指针与数组1.范例:判断用户输入的C字符串是否为"回文",所谓"回文"是指顺读和反读都一样的串,例如串 12321、madam。
【程序】#include<iostream>#include<cstring>using namespace std;const int SIZE=100;int main(){char carray[SIZE];int i,len,is_palindrome=1;cout<<"Please input a string:"<<endl;cin.get(carray,SIZE);len=strlen(carray);for(i=0;i<len/2;i++){if(carray[i]!=carray[len-1-i]){is_palindrome=0;break;}};if(is_palindrome) cout<<"The string is a palindrome"<<endl;else cout<<"The string isn't a palindrome"<<endl;return 0;}2. 【要求】(1)重新定义回文为:滤去所有非字母字符(包括空格)后,不考虑字母的大小写,从左向右和从右向左读都相同的词或短语。
如,”Madam, I’m adam” 和“Golf ,No Sir ,prefer prison flog!”#include<iostream>#include<cstring>using namespace std;int main(){char carray[10];int i,len,is_palindrome=1,a,b=0,j;cout<<"Please input a string:"<<endl;cin.get(carray,10);for(a=0;a<10;a++){if(carray[a]!=' ' && carray[a]!='!' && carray[a]!='?' && carray[a]!=',' && carray[a]!='.')carray[b]=carray[a];else continue;b++;};carray[b]='\0';len=strlen(carray);for(j=0;j<len;j++){if(carray[j]>=65&&carray[j]<=90) carray[j]=carray[j]+32;};for(i=0;i<len/2;i++){if(carray[i]!=carray[len-1-i]){is_palindrome=0;break;}};if(is_palindrome) cout<<"The string is a palindrome"<<endl;else cout<<"The string isn't a palindrome"<<endl;return 0;}(2)编写一个判断输入字符串是否为回文的函数,并使用指针形式访问数组元素。
一、指针数组及指向一维数组的指针(数组指针)讲解1、数组指针(也称行指针)定义 int (*p)[n];()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。
也就是说执行p+1时,p要跨过n个整型数据的长度。
如要将二维数组赋给一指针,应这样赋值:int a[3][4];int (*p)[4];//该语句是定义一个数组指针,指向含4个元素的一维数组。
p=a;//将该二维数组的首地址赋给p,也就是a[0]或&a[0][0] p++;//该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]所以数组指针也称指向一维数组的指针,亦称行指针。
2、指针数组定义 int *p[n];[]优先级高,先与p结合成为一个数组,再由int *说明这是一个整型指针数组,它有n个指针类型的数组元素。
这样赋值是错误的:p=a;只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。
但可以这样 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。
如要将二维数组赋给一指针数组:int *p[3];int a[3][4];for(i=0;i<3;i++)p[i]=a[i];这里int *p[3] 表示一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2]所以要分别赋值。
这样两者的区别就豁然开朗了,数组指针只是一个指针变量,似乎是C语言里专门用来指向二维数组的,它占有内存中一个指针的存储空间。
指针数组是多个指针变量,以数组形式存在内存当中,占有多个指针的存储空间。
还需要说明的一点就是,同时用来指向二维数组时,其引用和用数组名引用都是一样的。
比如要表示数组中i行j列一个元素:*(p[i]+j)、*(*(p+i)+j)、(*(p+i))[j]、p[i][j]优先级:()>[]>*例1、下列给定程序中,函数fun()的功能是:从N个字符串中找出最长的那个串,并将其地址作为函数值返回。
练习6 指针与一维数组参考答案
一、目的
1、掌握指针变量的定义和引用方法;
2、掌握用指向一维数组的指针编写应用程序的一般方法。
二、实验
1.运行程序C6_1r.C(《指导》P38实验3.6-1(1)),验证结果。
运行结果:a=13,b=10
2.运行程序C6_2r.C(《指导》P38实验3.6-1(2)),验证结果。
运行结果:2,2,2
3.运行程序C6_3r.C(《指导》P38实验3.6-1(3)),验证结果。
运行结果:1 2 3 4
4.程序修改:C6_4m.C首先使指针pa指向变量a(初值为10),然后通过pa间接访问a的方法将a的值修改为20。
程序在一对/**/之间有两个错误,请修改。
#include <stdio.h>
void main()
{int a=10,*pa;
/**/
pa=&a; /*将20赋给pa指向变量(即a)*/
*pa=20; /*将20赋给pa指向变量(即a)*/
/**/
printf("%d\n",a);
}
5.运行程序C6_5m.C,输入两个整数,观察程序能否实现功能:使用指针将两个数按降序重新存放。
如果不能实现,请修改程序实现上述要求。
#include <stdio.h>
void main( )
{int a,b,*p1=&a,*p2=&b,t;
printf("input a and b:");
scanf("%d %d",&a,&b);
if(a<b)
{t=*p1; /*应该将p1和p2指针指向的两个变量的值交换*/
*p1=*p2;
*p2=t;}
printf("a=%d,b=%d\n",a,b);
}
6.编写程序C6_6.C:用指针方法实现《指导》P39实验3.6-2(2)(将数组a中的n个数按反序存放)。
要求:
①用首地址偏移量法输入数组,用指针移动法输出数组;
②用某种指针方法实现反序存放。
#include<stdio.h>
#include<conio.h>
#define N 6
void main()
{ int a[N],i,*p=a;
int *q,temp;
/*输入数组,用首地址偏移量法*/
printf("Please input %d integers:\n",N);
for (i=0;i<=N-1;i++)
printf("Output the numbers :\n");
for (p=a;p<=a+N-1;p++) printf("%d ",*p);
printf("\n");
getch();
}
7.[书面作业]编写程序C6_7.C:用指针方法实现《教程》P191习题6.2(5)(输入10个整数存入数组a中,按从小到大的次序输出)。
解1:选择排序,用指针移动法实现
#include<stdio.h>
#define N 6
void main()
{int a[N],*p,*q,temp,*pmin;
printf("Please input %d integers:\n",N);
for(p=a;p<=a+N-1;p++) scanf("%d",p);
for (p=a;p<=a+N-1;p++) printf("%d ",*p);
printf("\n");
}
解2:选择排序,用指针偏移量法实现
#include<stdio.h>
#define N 6
void main()
{int a[N],*p=a,i,j,temp,*pmin;
printf("Please input %d integers:\n",N);
for(i=0;i<=N-1;i++) scanf("%d",p+i);
printf("Output the numbers :\n");
for(i=0;i<=N-1;i++) printf("%d ",*(p+i));
printf("\n");
}
三、编程选做(均要求用指针方法)
8.《教程》P191习题6.2(1)(输出数组元素的平均值)
9.《教程》P191习题6.2(2)(输出数组中的最大值与次最大值)
10.《教程》P191习题6.2(3)(将数组中最大值与最小值的位置互换后输出)#include<stdio.h>
#include<conio.h>
#define N 6
void main()
{ int a[N],i,*p=a;
int *pmin,*pmax,temp;
printf("Please input %d integers:\n",N);
for (i=0;i<N;i++)/
scanf("%d",a+i);
pmin=pmax=a;
for (p=a+1;p<a+N;p++)
if (*p<*pmin) pmin=p;
else if (*p>*pmax) pmax=p;
temp=*pmin;*pmin=*pmax;*pmax=temp;
printf("Output the numbers :\n");
for (p=a;p<a+N;p++)
printf("%d ",*p);
printf("\n");
getch();
}
11.[书面作业]《教程》P191习题6.2(4)(输入x,输出x在数组a中的位置,若数组a中没有值为x的元素,则输出“no found”)
注: 要求找到所有数
12.《教程》P191习题6.1(输入3个整数,按照从小到大的次序输出)
四、基础练习
《指导》P121“第6章指针”之基础练习:选择题1~9。