指针典型例题分析与解答

合集下载

指针经典练习题及答案

指针经典练习题及答案

二、程序题1、计算字符串中子串出现的次数。

要求:用一个子函数subString()实现,参数为指向字符串和要查找的子串的指针,返回次数。

2、加密程序:由键盘输入明文,通过加密程序转换成密文并输出到屏幕上。

算法:明文中的字母转换成其后的第4个字母,例如,A变成E(a变成e),Z变成D,非字母字符不变;同时将密文每两个字符之间插入一个空格。

例如,China转换成密文为G l m r e。

要求:在函数change中完成字母转换,在函数insert中完成增加空格,用指针传递参数。

3、字符替换。

要求用函数replace将用户输入的字符串中的字符t(T)都替换为e(E),并返回替换字符的个数。

4、编写一个程序,输入星期,输出该星期的英文名。

用指针数组处理。

5、有5个字符串,首先将它们按照字符串中的字符个数由小到大排列,再分别取出每个字符串的第三个字母合并成一个新的字符串输出(若少于三个字符的输出空格)。

要求:利用字符串指针和指针数组实现。

6、定义一个动态数组,长度为变量n,用随机数给数组各元素赋值,然后对数组各单元排序,定义swap函数交换数据单元,要求参数使用指针传递。

7、实现模拟彩票的程序设计:随机产生6个数字,与用户输入的数字进行比较,输它们相同的数字个数(使用动态内存分配)。

/*1、计算字符串中子串出现的次数。

要求:用一个子函数subString()实现,参数为指向字符串和要查找的子串的指针,返回次数。

*/#include<stdio.h>int subString(char *a, char *b){int i = 0;int j = 0;int m = 0;char *p = b;while(*a){while(*a){if(*a == *b){break;}a++;}while(*b){if(*a != *b){return m;}else{m = m;}b++;a++;}// a++;b = p;++m;}return m;}int main(){char a[100];char b[100];printf("请输入字符串a:");gets(a);printf("请输入字符串b:");gets(b);printf("%d", subString(a, b));return 0;}/*2、加密程序:由键盘输入明文,通过加密程序转换成密文并输出到屏幕上。

c语言指针例题

c语言指针例题

以下是一个简单的 C 语言指针例题:
c复制代码
#include<stdio.h>
int main() {
int a = 10;
int *p = &a; // 定义一个指向整型变量 a 的指针 p
printf("a 的值为:%d\n", a);
printf("p 所指向的值为:%d\n", *p); // 通过指针访问变量的值
*p = 20; // 通过指针修改变量的值
printf("a 的新值为:%d\n", a);
return0;
}
在这个例子中,我们定义了一个整型变量 a,然后定义了一个指向整型变量 a 的指针 p,并将指
针 p 的初始值设置为变量 a 的地址。

接着,我们通过指针访问变量的值,并修改了变量的值。

最后,我们输出了变量 a的新值。

需要注意的是,在使用指针时需要特别小心,因为指针操作涉及到内存地址的操作,如果操作不当可能会导致程序崩溃或者出现其他不可预期的错误。

C语言指针练习题解析

C语言指针练习题解析

一、知识点1.掌握指针、地址、指针类型、空指针(NULL)等概念;2.掌握指针变量的定义和初始化、指针的间接访问、指针的加减运算、指针变量比较运算和指针表达式;3.掌握指针与数组、函数、字符串等的联系;4.掌握动态空间操作(new,delete);5.掌握引用参数的使用。

二、例题分析与解答例题1:若有以下定义,则说法错误的是( )。

int a=100,*p=&a ;A.声明变量p,其中*表示p是一个指针变量B.变量p经初始化,获得变量a的地址C.变量p只可以指向一个整形变量D.变量p的值为100答案:D分析:有指针变量定义可知A、C说法是正确的,故不能选。

在语句中&p=a,表示指针变量取得变量a地址,B说法也正确,也不能选择。

D中不能说变量p的值为100,应该*p的值为100,所以选择D。

例题2:若有以下定义,则赋值正确的是( )。

int a ,b , *p;float c, *q;A.p=&c B.q=p C.p=NULL D.q=new int答案:C分析:指针变量使用规定,不同类型的指针变量不能赋值,也不能取得普通变量地址,故A、B不正确,不能选择。

因为q是float类型指针变量,不能申请int 类型地址,D不正确,也不能选择。

因为任何类型的指针变量都能取得NULL指针,所以C正确。

例题3:如果x是整型变量,则合法的形式是( )。

A.&(x+5) B.*x C.&*x D.*&x答案:D分析:因为C++语言表达式没有地址,A不正确。

C++语言普通变量不能用*运算,因此B和C也不正确。

&x 表示变量x的地址,*&x是x 地址的值,所以D正确。

例题4:若要建立如下关系,错误的语句组是( )。

span style='mso-ignore:vglayout; ;z-index:1;left:0px;margin-left:144px;margin-top:1px;width:256px;height:38px'A. B. C. D.int *p=&x, x; int x, p=&x; int *p, x=10; int *p, x;*p=10; *p=10; *p=&x; p=&x ; x=10;答案:A分析:在变量类型说明语句中 *表示变量是指针变量,在其他语句中,*称为指针运算,用于访问指针所指向的对象的值,&称为取地址运算,用来得到一个对象的地址。

第五章指针习题解答

第五章指针习题解答

习题解答第五章指针1、指针的基类型定义了该指针所指向变量的类型。

从技术上讲,任何类型的指针均可指向内存中的任何位置,但因所有的指针运算都是与它的基类型相关联的,所以正确说明指针非常重要。

(1)基类型使指针只能指向基类型定义的一类变量。

(2)限制引用操作满足基类型的约束(范围、运算、内存表示)。

(3)限制指针移动操作的跨度。

2、(1)通过指针引用数组元素是C语言提供的一种高效数组访问机制,通过带下标的指针变量引用一维数组元素。

(2)通过指针指向数组或数组元素的地址完成各种赋值、引用、移动、比较等操作。

数组名在C语言中被处理成一个地址常量,也就是数组所占连续存储单元的起始地址,一旦定义,数组名永远是数组的首地址,在其生存期不会改变。

可以通过数组首地址引用数组元素,输出数组中全部元素。

也可以将数组名与数组指针赋值完成各种操作。

3、(1)指针数组定义形式为int * a[size];实质是一个数组,共有size个元素,其中每个元素都是指针类型的,并且每个元素的基类型是整型。

(2)数组指针定义形式为int (*p)[size];实质是一个变量,是一个指针变量,这个指针变量的基类型是size 个int类型元素的数组。

简单的说数组指针是一个指针,它指向一个数组,通过这个指针可以对数组进行多种操作,和使用数组下标起到相同的作用,这个指针最初指向数组第一个元素;指针数组就是一个数组,它里边的元素都是指针。

举例如下:int *p[5]; // 指针数组,p是数组名,数组里放5个int指针。

int (*p)[5]; // 数组指针,p是指针名,指向一个有5个int元素的数组。

4、(1)int *p;//定义了一个基类型为整型的指针变量p即p是整型指针。

(2)int *p[5];//定义了一个指针数组p,数组中含有5个基类型为整型的指针,即p 是5个元素的数组,数组元素是整型指针。

(3)int (*p)[5]; 定义了一个数组指针p,p指向一个含有5个整型元素的数组,即p 是指针,指向数组,数组有5个整型元素。

指针例题

指针例题

指针变量的引用1.输入a和b两个整数,按先大后小的顺序输出a和b。

⏹解题思路:用指针方法来处理这个问题。

不交换整型变量的值,而是交换两个指针变量的值。

#include <stdio.h>int main(){ int *p1,*p2,*p,a,b;printf(“integer numbers:");scanf(“%d,%d”,&a,&b);p1=&a; p2=&b; //对指针变量赋初值if(a<b){ p=p1; p1=p2; p2=p; } //当a<b时,交换指针变量p1 ,p2指向的地址值printf(“a=%d,b=%d\n”,a,b);printf(“%d,%d\n”,*p1,*p2);return 0;}输入:5,9输出结果:a=5,b=99,5指针引用数组元素1. 有一个整型数组a,有10个元素,要求输出数组中的全部元素。

解题思路:引用数组中各元素的值有3种方法:(1)下标法;(2)通过数组名计算数组元素地址,找出元素的值;(3) 用指针变量指向数组元素(1) 下标法#include <stdio.h>int main(){ int a[10]; int i;printf(“enter 10 integer numbers:\n");for(i=0;i<10;i++) scanf("%d",&a[i]);for(i=0;i<10;i++) printf(“%d ”,a[i]);printf("%\n");return 0;}(2) 通过数组名计算数组元素地址,找出元素的值#include <stdio.h>int main(){ int a[10]; int i;printf(“enter 10 integer numbers:\n");for(i=0;i<10;i++) scanf("%d",&a[i]);for(i=0;i<10;i++)printf(“%d ”,*(a+i)); // *(a+i) 和a[i] 等价printf("\n");return 0;}(3) 用指针变量指向数组元素#include <stdio.h>int main(){ int i,*p,a[10],;printf(“enter 10 integer numbers:\n");for(i=0;i<10;i++)scanf("%d",&a[i]);for(p=a;p<=(a+9);p++) // 数组名a赋值给p,a+9表示数组最后一个元素a[9]的起始地址printf(“%d ”,*p);printf("\n");return 0;}#include <stdio.h>int main(){ int i,*p,a[10];printf("please enter 10 integer numbers:");for(p=a,i=0;i<10;i++) // 用指针变量输入,要将数组起始地址赋值给pscanf("%d",p++);p=a;for(i=0;i<10;i++,p++)printf("%d ",*p);printf("\n");return 0;}3种方法的比较:①第(1)和第(2)种方法执行效率相同◆C编译系统是将a[i]转换为*(a+i)处理的,即先计算元素地址。

c语言指针数组经典题目详解

c语言指针数组经典题目详解

c语言指针数组经典题目详解指针数组是一个数组,其元素都是指针。

C语言中,指针数组经常用于存储一组字符串或一组指向不同类型对象的指针。

下面是一些经典的题目,对指针数组进行详细解析。

题目1:将一个字符串数组按字典排序。

解析:首先,我们声明一个指向字符串的指针数组,将字符串数组的每个元素赋值给指针数组的对应元素。

然后使用冒泡排序法对指针数组进行排序,最后按照排序后的顺序打印指针数组元素所指向的字符串。

```c#include <stdio.h>#include <string.h>#define MAX_LENGTH 100#define MAX_NUM 10void bubbleSort(char* arr[], int size) {for (int i = 0; i < size - 1; i++) {for (int j = 0; j < size - 1 - i; j++) {if (strcmp(arr[j], arr[j+1]) > 0) {char* temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}}int main() {char* strings[MAX_NUM] = {"dog", "cat", "apple", "banana", "elephant", "fish", "goat", "zebra", "horse", "tiger"};int size = sizeof(strings) / sizeof(strings[0]);bubbleSort(strings, size);for (int i = 0; i < size; i++) {printf("%s\n", strings[i]);}return 0;}```题目2:将一个整数数组按升序排序。

(完整word版)C语言指针练习+答案+讲解

(完整word版)C语言指针练习+答案+讲解

第七章指针7.1 选择题1.若有说明:int a=2, *p=&a, *q=p;,则以下非法的赋值语句是(D)。

A. p=q; B. *p=*q; C. a=*q; D. q=a;a是整型数,int *p,*q定义了指针,p,q是指向整型的指针.p取得a的地址,而q取得p的地址p,q是指针(也就是一个地址),而*p和*q是这个指针指向的整型数值(存放在这个地址的值).A)把q的地址赋给p,则p和q完全一样了,都指向一个数2B)把q中数据个pC)把q中数据给aD)a中数据是2,不能够给一个地址。

除非*q=a2.若定义:int a=511, *b=&a;,则printf("%d\n”, *b);的输出结果为:D A.无确定值 B. a的地址 C. 512 D. 511int a=511,*b=&a;a 是整形变量b 是整形指针变量,指向 aprintf("%d\n",*b);就是输出指针变量 b,所指变量的值输出结果5113.已有定义int a=2, *p1=&a, *p2=&a; 下面不能正确执行的赋值语句是(B)。

A. a=*p1+*p2; B. p1=a; C. p1=p2; D. a=*p1*(*p2);47、已知在程序中定义了如下的语句:int *P1,*P2;int k;p1=&k;p2=&k;则下列语句中不能正确执行是( B )A、k=*P1+*P2;B、p2=k;C、P1=P2;D、K=*P1 * (*P2);P1 P2是指针,K是整型变量,变量怎么可以赋值给指针呢?A其实是执行了K=K+K(P1和P2都指向K,所以*P1 *P2其实都是指K)C是赋值语句D其实执行了K=K*K4.变量的指针,其含义是指该变量的(B)。

A.值 B.地址 C.名 D.一个标志5.若有说明语句:int a, b, c, *d=&c;,则能正确从键盘读入三个整数分别赋给变量a、b、c的语句是(A)。

C语言指针精选习题和答案

C语言指针精选习题和答案

一、用指针方法编写一个程序,输入3个整数,将它们按由小到大的顺序输出#include <stdio.h>void swap(int *pa,int *pb){int temp;temp = *pa;*pa = *pb;*pb = temp;}void main(){int a,b,c,temp;scanf("%d%d%d",&a,&b,&c);if(a>b)swap(&a,&b);if(b>c)swap(&b,&c);if(a>c)swap(&a,&c);printf("%d,%d,%d",a,b,c);}二、C语言用指针方法输入3个字符串按由小到大顺序输出#include "stdio.h"#include "string.h"int main(int argc, char* argv[]){char *t;char *p1=NULL,*p2=NULL,*p3=NULL;char ch1[20]={0},ch2[20]={0},ch3[20]={0};p1=ch1;p2=ch2;p3=ch3;printf("No1:");scanf("%s",p1);fflush(stdin);printf("No2:");scanf("%s",p2);fflush(stdin);printf("No3:");scanf("%s",p3);fflush(stdin);if(strcmp(p1,p2)>0){t=p1;p1=p2;p2=t;}if(strcmp(p1,p3)>0){t=p1;p1=p3;p3=t;}if(strcmp(p2,p3)>0){t=p2;p2=p3;p3=t;}printf("%s\n%s\n%s\n",p1,p2,p3);return 0;}9.4编程输入一行文字,找出其中的大写字母,小写字母,空格,数字,及其他字符的个数#include<stdio.h>void main(){int a=0,b=0,c=0,d=0,e=0,i=0;char *p,s[20];while((s[i]=getchar())!='\n')i++;p=s;while(*p!=10){if(*p>='A'&&*p<='Z')a++;else if(*p>='a'&&*p<='z')b++;else if(*p==' ')c++;else if(*p>='0'&&*p<='9')d++;else e++;p++;}printf("大写字母%d 小写字母%d\n",a,b);printf("空格 %d 数字 %d 非字符 %d\n",c,d,e);}9.5写一个函数,将3 3矩阵转置#include "stdio.h"void Transpose(int (*matrix)[3]){int temp;int i, j;for(i=1;i<3;i++)/*转置*/{for(j=0;j<i;j++){temp = *(*(matrix+j)+i);*(*(matrix+j)+i) = *(*(matrix+i)+j);*(*(matrix+i)+j) = temp;}}}void main(){int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};Transpose(a);for(int i = 0;i<3;i++){for(int j=0;j<3;j++){printf("%d ",a[i][j]);}printf("\n");}}}9.6用指向一维数组的指针做函数参数#include<stdio.h>#include<string.h>int main(){void sort(char (*s)[6]);//一维数组的指针做函数参数int i;char str[10][6];char (*p)[6];//定义一维数组的指针做函数参数printf("please input string:/n");for(i=0;i<10;i++)scanf("%s",&str[i]);p=str;//将str一维数组指针,赋值给p;sort(p);printf("the output sequence :/n");for(i=0;i<10;i++)printf("%s/n",str[i]);return 0;}void sort(char (*s)[6])//s指向一维数组的指针做函数参数;{int i,j;char temp[6], *t;t=temp;for(i=0;i<9;i++)//i应该小于9;如果小于10,那么就比较了9+1次;按照冒泡法则,for(j=0;j<9-i;j++)//第一次比较需要9次就是i=0到i=8共九次;第二次需要比较8次;依次类推;if(strcmp(s[j],s[j+1])>0){strcpy(t,s[j]);strcpy(s[j],s[j+1]);strcpy(s[j+1],t);}}9.7编一程序,用指针数组在主函数中输入十个等长的字符串。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

指针典型例题分析与解答1 对于变量x,其地址可以写成________;对于数组y[10],其首地址可以写成________或__________;对于数组元素y[3],其地址可以写成__________或_________。

【分析】变量的地址可以写成“&变量名”。

数组的首地址就是数组名,也可以写成第 1个元素的地址“&数组名[0]”。

数组元素的地址可以写成“&数组元素”,也可以写成“数组首地址十下标”。

【答案】&xy&y[0]&y[3]y+32 设有定义语句“int k,*p1=&k,*p2;”,能完成表达式“p2=&k”功能的表达式可以写成_______________。

【分析】注意原来表达式“p2=&k”的主要功能是将变量k的地址存放到指针变量p2中。

现在变量k的地址已经存放在指针变量pl中,所以完成“p2=&k”功能的表达式是:p2=p1.【答案】p2=p13 设有两条语句“int a,*p=&a;”和“*p= a;”,则下列说法中正确的是()①两条语句中的“*p”含义完全相同②两条语句中的“*p=&a”和“*p=a”功能完全相同③第 1条语句中的“*p=&a”是定义指针变量 p并对其初始化④第2条语句中的“*p=a”是将a的值赋予变量p【分析】分析备选答案①:第1条语句是数据定义语句,其中的“*p”表示定义的变量p是指针型变量;第2条语句是赋值语句,其中的“*p”代表它所指向的变量a,所以该备选答案是错误的,不符合题意。

分析备选答案②:第 1条语句中的“*p=&a”是将变量 a的地址以初值方式赋予指针变量 p;而第 2条语句中的“*p=a”是将变量 a中的值赋予指针变量 P指向的变量(注意也是 a,即该语句的作用和 a = a完全相同),显然该备选答案是错误的,不符合题意。

再分析备选答案③:显然该答案是正确的,符合题意。

至于备选答案④,显然是错误的“*p”是代表指针变量p指向的变量,不能代表指针变量p。

【答案】③4 设有定义语句“ int x,*p= &x;”,则下列表达式中错误的是()①*&x②&*x ③*&p④&*p【分析】注意“*”和“&”运算将是同一优先级别的,结合性是自有向左。

接着来分报备选答案①:&x 代表变量x的地址,*(&x)代表“&x”地址对应的变量,即变量X,一股说“*&变量”就是该变量,所以该答案是正确的,不符合题意。

备选答案②中的“*x”是错误的,因为x是普通变量,不是指针型变量,而运算符“*”的运算对象必须是地址,所以该答案符合题意。

显然备选答案③和④都是正确的。

我们来分析一下。

备选答案③的格式属于“*&变量”,所以其结果为指针型变量p,是正确的。

备选答案④中的“*P”代表指针变量P指向的变量x,(*p)代表变量X的地址,也是正确的。

一般说“&*指针变量”,则代表指针变量指向的变量的址。

【答案】②5 设有定义语句“float s[10],*p1=s,*p2=s+5;”,下列表达式中错误的是()① p1= 0xffff ② p2--③ p1-p2 ④ p1<=p2【分析】当两个指针变量指向同一个数组时,每个针变量都可以进行增 l、减 1运算,两个指针变量之间可以进行减法运算和关系运算。

显然备选答案②、③。

④是正确的,不符合题意,只有备选答案①才是错误的,符合题意。

对备选答案①的分析也很简单,因为C语言规定,所以的地址表达式中,不允许使用具体的整数来表示地址。

【答案】①6 有下列定义语句“char s[]={"12345"},*p=s;”,下列表达式中错误的是()①*(p+2)②*(s+2) ③ p="ABC" ④ s="ABC"【分析】分析备选答案①:指针变量p已经指向数组s首地址,则p+2代表数组元素s[2]的地址,*(p +2)就是代表数组元素s[2],所以是正确的,不符合题意。

分析备选答案②:s是数组名,代表数组首地址,s+ 2代表数组元素 a[2]的地址,*(S+ 2)代表数组元素s[2],和备选答案①一样,也不符合题意。

分析备选答案③:C语言规定,在程序中可以使用赋值运算符将字符串常量直接赋予字符型指针变量,所以该备选答案也是正确的,不符合题意。

只有备选答案④是错误的,符合题意。

原因是C语言规定,在程序中不允许将字符串常量以赋值语句方式直接赋予字符型数组。

【答案】④7 设有语句“float x[4][10],*p=x;”,则下列表达式中不属于合法地址的表达式是()①&x[1][2]②*(p+1* 10+2)③x[1]④ p+1* 10+2[分析]分析备选答案①:x[1][2]是合法的数组元素,所以“&x[1][2]”表示数组元素 x[l][2]的地址。

分析备选答案②:由于指针变量指向二维数组首地址,“*(指针变量十行下标*列长度十列下标)”是表示数组元素“数组名[行下标][列下标]”的,不表示地址,所以该答案符合题意。

至于备选答案③,x[l]代表数组 X中行下标为 1的所有元素组成的一维数组名,即该一维数组的首地址,所以是一个地址表达式。

备选答案④中的表达式是代表数组元素x[1][2]的地址的,具体分析可以参看上面备选答案②中的分析。

【答案】②8 设有定义语句“double d[3][5]= {{1},{2},{3}},(*p)[5]=d;”,则下列表达式中值不为0.0的表达式是()①*&d[1][2] ②p[1][2]③*(p+1*5+2)④*(*(p+l)+2)【分析】首先看看数组d中各元素的初值,显然d[0][0]的初值为1.0、d[l][0]的初值为2.0.d[2][0]的初值为3.0,其余元素的初值均为0.0。

接着分析备选答案①:*&d[1][2]就是d[l][2],所以其值为0.0,不符合题意。

分析备选答案②:p[1][2]就是d[1][2],显然其值为 0.0,不符合题意。

再分析备选答案③:该表达式运算后的结果相当于*(p+7),由于指针变量p是指向长度为5的一维数组的,所以,这个表达式代表地址,其值不是0.0,符合题意。

显然备选答案④中表达式的值为0.0 ;因为该表达式相当于数组元素d[1][2]。

【答案】③9 设有定义语句“char s[3][20],(*p)[20]=s;”,则下列语句中错误的是()① scanf("%s", s[2]);② gets(*(p+2));③ scanf("%s",(p+2)+0);④ gets(s[2][0]);【分析】分析备选答案①、③,都是通过scanf()函数输入一个字符串,该函数中的第2个参数要求是地址。

备选答案①中的S[2]是一个地址,表示输入的字符串存人字符数组s的第2行,所以是正确的。

由于指针变量p是指向长度为20的一维数组,所以备选答案③中的*(p+2)+0相当于s[2][0] 的地址,也是正确的。

备选答案②、④是通过gets()输入字符串的,该函数的参数也是地址。

分析备选答案②中的*(p+2)字符数组s的第2行组成的一维数组的首地址,所以是正确的。

备选答案④中的s[2][0]是数组元素,不是地址,所以是错误的。

【答案】④10 设有下列程序段,该程序段输出的结果是int k[2]={5,4},*P[2];p[o]=k,p[l]=k+l;prinif("%d",*p[1]);【分析】从定义语句中可以看出,p是一个指针型数组,共有两个数组元素:p[0]和p[1]。

两个赋值表达式组成的逗号表达式使得p[0]指向整型数组元素k[0],其值为5;p[1]指向整型元素 k[l],其值为4。

输出语句中的输出表达式“*P[1]”是代表指针数组元素p[l]指向的整型数组元素k[1]的,其值为4。

【答案】 411 设有下列定义语句,则表达式“**p2”的值是_______________,表达式“*(*p2+l)”的值是_________________。

int x[3]={1,2,3},*p1= x,**p2=&p1;【分析】从定义语句中可以看出,pl是指向整型数组 X首地址的一级指针变量,p2是指向一级指针变量pl的二级指针变量。

从运算符“*”的结合性是自右向左的来看,表达式**p2相当于肝*(*p2),*p2相当于p1,所以**p2相当于*pl,由于一级指针变量p1指向的是数组X的首地址,即x[0]的地址,所以其值为x[0]的值,等于1。

第2个表达式*(*p2+1)相当于*(p1+1),而pl+l相当于数组元素x[1]的地址,所以该表达式的值就是数组元素x[1]的值,等于2.【答案】 1212 设有下列程序,假定该程序运行后的输出是:234。

请填写程序中缺少的语句成份。

main(){ char *p="12345678";while(____________){ printf("%c",*p+1);p++;}}【分析】从数据定义语句中看出,字符型指针变量指向字符串"12345678",即指针变量p指向第1个字符'l'。

由于程序所缺少的是控制循环的条件,假定第1次执行循环体时条件成立,输出的结果是"*p+1",即是指向字符'l'的,'1'+1的结果是字符'2',输出结果为2,与题目要求一致,然后执行p++,使p指向第2个字符'2'。

显然第2次执行循环体输出结果为字符'3',符合题目要求。

第3次执行循环体输出字符是'4',也符合题目要求。

注意此时p已经指向字符串中的第4个字符'4',显然不能再执行循环体了,否则将输出字符'5'。

可以看出,所缺少的控制循环条件是当p指向字符串中第4个字符'4'时必须退出循环。

这个条件很容易写成“p指向的字符不是'4'”。

具体来说,这个条件表达式可以写成“*p!='4'”,也可以写成“*p<'4'”或者“*p<='3'”等等。

【答案】*p='4'或者*p<'4'或者即*p<='3'13 下列程序的功能是输入一个字符串存入字符数组a中,然后将其中的所有字符'\ DOWN'删除后再存入字符数组b,最后将字符数组b中的字符串输出。

请填写程序中缺少的语句。

#include”string.h”main(){ char a[81],b[8l],*p1=a,*p2=b;gets(p1);while(*p1='\0')if(*p1==‘\\')___________________else*p2++=*p1++;puts(b);}【分析】程序中的当型循环是完成删除数组a中存放的字符串中字符'\'的,分析控制这个循环的条件可知,这是依次处理存放在字符数组a中每个字符的标准程序段。

相关文档
最新文档