练习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值,不能被重新分配;指针是一个存放地址的变量。
练习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。