文档库 最新最全的文档下载
当前位置:文档库 › 指针习题

指针习题

指针习题
指针习题

指针习题

一、单项选择题(下列每小题有4个备选答案,将其中的一个正确答案填到其后的括号内)

1.设有定义:int a[10],*p=a;,对数组元素的正确引用是()。

①a[p] ②p[a] ③*(p+2)

④ p+2

2.若有如下定义,则不能表示数组a元素的表达式是()。

int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a;

①*p ②a[10] ③*a

④ a[p-a]

3.若有如下定义,则值为3的表达式是()。

int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a;

① p+=2,*(p++) ② p+=2,*++p ③ p+=3,*p++ ④p+=2,++*p

4.设有定义:char a[10]="ABCD",*p=a;,则*(p+4)的值是()。

①"ABCD" ②’D’ ③’\0’ ④不确定

5. 将p定义为指向含4个元素的一维数组的指针变量,正确语句为()。

①int (*p)[4]; ②int *p[4]; ③int p[4];

④ int **p[4];

6.若有定义int a[3][4];,则输入其3行2列元素的正确语句为()。

①scanf("%d",a[3,2]); ②scanf("%d",*(*(a+2)+1))

③scanf("%d",*(a+2)+1); ④scanf("%d",*(a[2]+1));

7.下面对指针变量的叙述,正确的是()。

①指针变量可以加上一个指针变量。

②可以把一个整形数赋给指针变量。

③指针变量的值可以赋给指针变量。

④指针变量不可以有空值,即该指针变量必须指向某一变量。

8.设有定义:int a[10],*p=a+6,*q=a;,则下列运算哪种是错误的()。

①p-q ②p+3 ③p+q

④ p>q

9.C语言中,数组名代表()。

①数组全部元素的值②数组首地址

③数组第一个元素的值④数组元素的个数

10.若有如下定义,则数值为4的表达式是()。

int a[12]={1,2,3,4,5,6,7,8,9,10,11,12};

char c=’a’,d,g;

①a[g-c] ②a[4] ③a[’d’-’c’]

④ a[’d’-c]

11.设有定义:char s[12]="string";,则printf("%d",strlen(s));

的输出结果是()。

① 6 ②7 ③11

④ 12

12.语句printf("%d",strlen("abs\no12\1\\"));的输出结果是

()。

①11 ②10 ③9

④ 8

13.设有定义:int t[3][2];,能正确表示t数组元素地址的表

达式是()。

①&t[3][2] ②t[3] ③t[1]

④ *t[2]

14.语句strcat(strcpy(str1,str2),str3);的功能是()。

①将字符串str1复制到字符串str2中后再连接到字符

串str3之后。

②将字符串str1连接到字符串str2中后再复制到字符

串str3之后。

③将字符串str2复制到字符串str1中后再将字符串str3

连接到字符串str1之后。

④将字符串str2连接到字符串str1中后再将字符串str1

复制到字符串str1中。

15.若有如下定义,则正确的叙述为()。

char x[]="abcdefg";

char y[]={’a’,’b’,’c’,’d’,’e’,’f’,’g’};

①数组x和数组y等价②数组x和数

组y的长度相同

③数组x的长度大于数组y的长度④数组y的长

度大于数组x的长度

二、程序分析题

main()

{ int a[3][3]={{1,2},{3,4},{5,6}};

int i,j,s=0;

for(i=0;i<3;i++)

for(j=0;j<=i;j++)

s+=a[i][j];

printf("%d\n",s);

}

2.下列程序的运行结果是

main()

{ int i,j,k,n[3];

for(i=0;i<3;i++) n[i]=0;

k=2;

for(i=0;i

for(j=0;j

n[j]=n[i]+1;

printf("%d\n",n[1]);

}

main()

{ int a[]={2,4,6,8,10};

int y=1,x,*p;

p=&a[1];

for(x=0;x<3;x++)

y+=*(p+x);

printf("%d\n",y);

}

4.下列程序的运行结果是

main()

{ int i,c;

char num[][4]={"CDEF","ACBD"};

for(i=0;i<4;i++)

{ c=num[0][i]+num[1][i]-2*’A’;

printf("%3d",c);

}

}

5.下列程序的运行结果是

main()

{ char a[]="*****";

int i,j,k;

for(i=0;i<5;i++)

{ printf("\n");

for(j=0;j

for(k=0;k<5;k++) printf("%c",a[k]);

}

}

6.下列程序的功能是

main()

{ int i,a[10],*p=&a[9];

for(i=0;i<10;i++) scanf("%d",&a[i]);

for(;p>=a;p--) printf("%3d",*p);

}

7.下列程序的运行结果是

main()

{ char ch[2][5]={"6937","8254"},*p[2];

int i,j,s;

for(i=0;i<2;i++) p[i]=ch[i];

for(i=0;i<2;i++)

{ s=0;

for(j=0;ch[i][j]!=’\0’;j++)

s=s*10+ch[i][j]-’0’;

printf("%5d",s);

}

}

8. 下列程序的运行结果是

#include "stdio.h"

main()

{ int i,k,a[10],p[3];

k=5;

for ( i=0;i<10;i++)

a[i]=i;

for(i=0;i<3;i++)

p[i]=a[i*(i+1)];

for( i=0;i<3;i++)

k+=p[i]*2;

printf("%d\n",k);

}

9.下列程序的运行结果是

#include "stdio.h"

main( )

{ int a=2,*p,**pp;

pp=&p;

p=&a;

a++;

printf("%d,%d,%d\n",a,*p,**pp);

}

10.下列程序的运行结果是

main( )

{ int a[6],i;

for(i=0;i<6;i++)

{ a[i]=9*(i-2+4*(i>3))%5;

printf("%2d",a[i]);

}

}

三、程序填空题(将下列程序的处填上正确的内容,使程序完整)

1.下列程序的功能是输出数组s中最大元素的下标。

main()

{ int k,i;

int s[]={3,-8,7,2,-1,4};

for(i=0,k=i;i<6;i++)

if(s[i]>s[k]) ;

printf("k=%d\n",k);

}

2.下列程序的功能是将一个字符串str的内容颠倒过来。

#include "string.h"

main()

{ int i,j,k;

char str[]="1234567";

for(i=0,j= ;i

{ k=str[i];str[i]=str[j];str[j]=k;}

printf("%s\n",str);

}

3.下列程序的功能是把输入的十进制长整型数以十六进制数的形式输出。

main()

{ char b[]="0123456789ABCDEF";

int c[64],d,i=0,base=16;

long n;

scanf("%ld",&n);

do

{c[i]= ;i++;n=n/base;

}while(n!=0);

for(--i;i>=0;--i)

{ d=c[i];printf("%c",b[d]);}

}

4.下列程序的功能是从键盘输入若干个字符(以回车键作为结束)组成一个字符串存入一个字符数组,然后输出该数组中的字符串。

#include "stdio.h"

main()

{ char str[81],*ptr;

int i;

for(i=0;i<80;i++)

{ str[i]=getchar();

if(str[i]==’\n’) break;

}

str[i]= ;

ptr=str;

while(*ptr) putchar( );

}

5.下列程序的功能是将数组a的元素按行求和并且存储到数组s中。

main()

{ int s[3]={0};

int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

int i,j;

for(i=0;i<3;i++)

{ for(j=0;j<4;j++)

;

printf("%d\n",s[i]);

}

}

四、程序改错题(下列每小题有一个错误,找出并改正)

1.下列程序的功能是输入一个字符串,然后再输出。

main()

{ char a[20];

int i=0;

scanf("%s",&a);

while(a[i]) printf("%c",a[i++]);

}

2.下列程序的功能是复制字符串a 到b中。

main()

{ char *str1=a,*str2,a[20]="abcde",b[20];

str2=b;

while(*str2++=*str1++);

}

3.下列程序的功能是统计字符串中空格数。

#include "stdio.h"

main()

{ int num=0;

char a[81],*str=a,ch;

gets(a);

while((ch=*str++)!=’\0’)

if(ch=’’) num++;

printf("num=%d\n",num);

}

4.下列程序的功能是将字符串str中小写字母的个数、大写字母的个数和数字字符的个数分别存入a[0]、a[1]和a[2]中。

#include "stdio.h"

main()

{ char str[80];

int a[3],i=0;

gets(str);

for(;str[i]!=’\0’;i++)

if(str[i]>=’a’&&str[i]<=’z’) a[0]++;

else if(str[i]>=’A’&&str[i]<=’Z’) a[1]++;

else if(str[i]>=’0’&&str[i]<=’9’) a[2]++;

for(i=0;i<3;i++)

printf("%4d\n",a[i]);

}

5.下列程序的功能是计算3×3矩阵的主对角线元素之和。

main()

{ int i,a[3][3]={1,2,3,4,5,6,7,8,9},sum=0;

for(i=1;i<=3;i++) sum+=a[i][i];

printf("sum=%d\n",sum);

}

五、程序设计题

1.输入10个整型数存入一维数组,输出值和下标都为奇数的元素个数。

2.从键盘输入任意10个数并存放到数组中,然后计算它们的平均值,找出其中的最大数和最小数,并显示结果。

3.有5个学生,每个学生有四门课程,将有不及格课程的学生成绩输出。

4.已知两个升序序列,将它们合并成一个升序序列并输出。

5.从键盘上输入一个字符串,统计字符串中的字符个数。不许使用求字符串长度函数strlen()。

6.输入一个字符串存入数组a,对字符串中的每个字符用加3的方法加密并存入数组b,再对b中的字符串解密存入数组c。最后依次输出数组a、b、c中的字符串。

7.输入一个字符串,输出每个大写英文字母出现的次数。

8.把从键盘输入的字符串逆置存放并输出。

9.输出4×4阶矩阵的主次对角线元素之和。

10.统计一个英文句子中含有英文单词的个数,单词之间用空格隔开。

11.从键盘上输入四个字符串(长度小于80),对其进行升序排序并输出。

12.已知一个排好序的数组,输入一个数,要求按原来排序的规律将它插入到数组中。

13.编写程序,实现两个字符串的比较。不许使用字符串比较函数strcmp()。

14.已知A是一个4×3阶矩阵,B是一个3×5阶矩阵,计算A和B的乘积。

15.输入10个数,将其中最小数与第一个数交换,将最

大数与最后一个数交换。

16.有n个人围成一个圈子,从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号。

17.给定一个一维数组,任意输入6个数,假设为1、2、3、4、5、6。建立一个具有以下内容的方阵存入二维数组中。

1 2 3 4 5 6

2 3 4 5 6 1

3 4 5 6 1 2

4 5 6 1 2 3

5 6 1 2 3 4

6 1 2 3 4 5

18.数组a中存放10个四位十进制整数,统计千位和十位之和与百位和个位之和相等的数据个数,并将满足条件的数据存入数组b中。

19.将一个英文句子中的前后单词逆置(单词之间用空格隔开)。

如:how old are you

逆置后为:you are old how

20.将一个小写英文字符串重新排列,按字符出现的顺序将所有相同字符存放在一起。

如:acbabca

排列后为:aaaccbb

指针习题

指针(C语言程序设计习题解答与上机指导) 1.以下说法正确的是() A.一个变量的地址称为该变量的指针 B.变量的地址和指向它的指针变量的地址是相同的 C.指针变量的指向一旦确定就不能改变 D.不能定义两个指针变量指向同一个变量 答案:A 2.执行下面程序的输出结果为() int m=1,j,+p=&m; for (j=0;j<3;j++) *p=*p+j; printf(“%d,%d”,m,*p); A. 1,4 B. 4,4 C.1,1 D.4,1 答案:B 3.若有“int a[6],*p;p=a;”,则不能正确对数组元素进行引用的是() A.a[0] B. *p C. *(p+2) D. p+2 答案:D 4.下列语句正确的是() A. char a[]=”dcba”; B. char a[10];a[]=”dcba”; C. char *p;*p=”dcba”; D. char a[10];a=”dcba”; 答案:A 5.若有“char *a[2]={“321”,“654”};”,以下说法正确的是() A.数组a为2*4的二维数组 B.可以用puts(*a[0]);输出“321” C.a[0]的值为“321”的首地址 D.定义错误 答案C 6.设有定义:float x,*p= &x;则下列表达式中错误的是() A.*&p B. *&x C. &*p D. &*x 答案:D 7.若定义short num[][3]={2,4,6,8,10,12};则num[1][1]的值是() A.8 B.4 C.2 D.10 答案:D 8.设有定义语句“float s[10],*p1=s,*p2=s+9;”,则下列表达式中,不能表示数组s的合法数组元素的是() A.*(p1--)B.*(++p1)C.*(--p2)D.*(++p2) 答案:D 9.设有:char s[3][8]={“1”,“21”,“321”},*p=s;则正确的语句是() A.printf(“%s”,*(p+1*8+0)) B.puts(*(*(p+1)+0)) C.scanf(“%s”,*(*(p+1)+0)) D.gets(&s[1][1]) 答案:D 10.执行下列程序段后,*(p+5)的值是()

C语言指针实验报告

C语言程序设计实验报告 1实验目的 (1)掌握指针的概念,会定义和使用指针变量; (2)能正确使用变量的指针和指向变量的指针变量; (3)能正确使用数组的指针和指向数组的指针变量; (4)能正确使用字符串的指针和指向字符串的指针变量; 2实验内容 将一个任意整数插入到已排序的整形数组中,插入后,数组中的数仍然保持有序;要求: (1)整形数组直接由赋值的方式初始化,要插入的整数有scanf()函数数入;(2)算法实现过程采用指针进行处理; (3)输入原始数据以及插入整数后的数据,并加以说明;

3算法描述流程图

4源程序 #include main() { int a[100],m,i,*p,n,w; printf("请输入要输入的数组的元素个数:\n"); scanf("%d",&n); printf("请输入已排好序的数组:\n"); for(i=0;i=w;i--) { a[i+1]=a[i]; } a[i+1]=m; for(i=0;i<=n;i++) { printf("%-4d",a[i]); } printf("\n"); } 5测试数据 “1,3,5,7,9,11,13,15,17,19······10” 6运行结果 7出现问题及解决方法 在编写过程中,

for(i=n-1;a[i]>=w;i--) { a[i+1]=a[i]; } a[i+1]=m; 这一步没有注意a[i++]=m和a[i+1]=m中i++和i+1不同,a[i++]=m是先将的值赋给a[i],然后在执行自增;而在实验过程中忽略了这一点,造成了不必要的麻烦; 8实验心得 通过这次指针实验掌握了指针的概念,会定义和使用指针变量,并且能利用指针来简单化一些问题,给以后的编程带来了很大的便利;

关于堆栈和指针(指针例子解释很好)

关于堆栈和指针 堆栈是一种执行“后进先出”算法的数据结构。 设想有一个直径不大、一端开口一端封闭的竹筒。有若干个写有编号的小球,小球的直径比竹筒的直径略小。现在把不同编号的小球放到竹筒里面,可以发现一种规律:先放进去的小球只能后拿出来,反之,后放进去的小球能够先拿出来。所以“先进后出”就是这种结构的特点。 堆栈就是这样一种数据结构。它是在内存中开辟一个存储区域,数据一个一个顺序地存入(也就是“压入——push”)这个区域之中。有一个地址指针总指向最后一个压入堆栈的数据所在的数据单元,存放这个地址指针的寄存器就叫做堆栈指示器。开始放入数据的单元叫做“栈底”。数据一个一个地存入,这个过程叫做“压栈”。在压栈的过程中,每有一个数据压入堆栈,就放在和前一个单元相连的后面一个单元中,堆栈指示器中的地址自动加1。读取这些数据时,按照堆栈指示器中的地址读取数据,堆栈指示器中的地址数自动减1。这个过程叫做“弹出pop”。如此就实现了后进先出的原则。 堆栈是计算机中最常用的一种数据结构,比如函数的调用在计算机中是用堆栈实现的。 堆栈可以用数组存储,也可以用以后会介绍的链表存储。 下面是一个堆栈的结构体定义,包括一个栈顶指针,一个数据项数组。栈顶指针最开始指向-1,然后存入数据时,栈顶指针加1,取出数据后,栈顶指针减1。 #define MAX_SIZE 100 typedef int DATA_TYPE; struct stack { DATA_TYPE data[MAX_SIZE]; int top; }; 堆栈是系统使用是临时存储区域。它是后进先出的数据结构。 C++主要将堆栈用于函数调用。当函数调用时,各种数据被推入堆栈顶部;函数终止后的返回地址、传递给函数的参数、函数返回的结果以及函数中声明的局部变量等等。因此当函数A调用函数B调用函数C,堆栈是增长了,但调用完成后,堆栈又缩小了。 堆是一种长期的存储区域。程序用C++的new操作符分配堆。对new的调用分配所需的内存并返回指向内存的指针。与堆栈不同,你必须通过调用new明确的分配堆内存。你也必须通过调用C++的delete 操作符明确的释放内存,堆不会自动释放内存。 如果C++中的一个类是定义在堆栈上的,就使用"."开访问它的成员。如果是定义在堆上的,就使用"->"指针来开访问。但在,"->"操作符也可以用在堆栈上的类。 什么是指针? 和其它变量一样,指针是基本的变量,所不同的是指针包含一个实际的数据,该数据代表一个可以找到实

《C++指针》习题参考答案

《C++指针》习题 学号姓名 一、选择题 1、有定义如下:int a[5], *p; 则下列描述错误的是B A.表达式p=p+1是合法的B.表达式a=a+1是合法的 C.表达式p-a是合法的D.表达式a+2是合法的 2、函数定义为Fun(int &i),变量定义n=100,则下面调用该函数正确的 是C A.Fun(20) B.Fun(20+n) C.Fun(n) D.Fun(&n) 3、若有说明int I,j=2,*p=&i;则能完成i=j赋值功能的语句是B A.i=*p; B.*p=*&j; C.i=&j; D.i=**p; 4、设已有定义char *st = "how are you";下列程序中正确的是A A.char a[11],*p;strcpy(p=a+1,&st[4]); B.char a[11];strcpy(++a,st); C. char a[11];strcpy(a,st); D. char a[],*p;strcpy(p=a[1],st+2); 5、设有数组int array[3][4],下列引用数组元素的方法中错误的是D A.array[i][j] B.*(*(array+i)+j) C. *(array[i]+j) D. *(array+i*4+j) 6、有定义int s[4][5],(*ps)[5];ps=s;则对数组s中元素引用的正确 的是C A.ps+1 B.*(ps+3) C. ps[0][2] D. *(ps+1)+3 7、设有说明int b[4][4],以下不能等价表示元素b[3][3]的是:B A.*&b[3][3] B.(*(*(b+3))+3) C.*(b[3]+3) D.*(*(b+3)+3) 8、若有说明"char *s[]={"234","5678","9012","3456","7890"};",则表达 式*s[1]> *s[3]比较的是B A."1234"和"9012" B.'5'和'3' C.'l'和'9' D."5678"和"3456" 9、设语句"char *s[]={"Student","Teacher","Father","Mother"},*ps=s[2];",执行语句"cout<<*s[1]<<','<

指针典型例题分析与解答

指针典型例题分析与解答 1 对于变量x,其地址可以写成________;对于数组y[10],其首地址可以写成________或__________;对 于数组元素y[3],其地址可以写成__________或_________。 【分析】变量的地址可以写成“&变量名”。数组的首地址就是数组名,也可以写成第 1个元素的地址“&数组名[0]”。数组元素的地址可以写成“&数组元素”,也可以写成“数组首地址十下标”。 【答案】&x y &y[0] &y[3] y+3 2 设有定义语句“int k,*p1=&k,*p2;”,能完成表达式“p2=&k”功能的表达式可以写成 _______________。 【分析】注意原来表达式“p2=&k”的主要功能是将变量k的地址存放到指针变量p2中。现 在变量k的地址已经存放在指针变量pl中,所以完成“p2=&k”功能的表达式是:p2=p1. 【答案】p2=p1 3 设有两条语句“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的地址,也是正确的。一般说“&*指针变量”,则代表

指针实验

实验名称:指针使用 实验目的:熟悉指针的正确用法。 相关知识:1.指针的定义;2.指针的引用; 实验内容: (1) 调试下面程序,指出错误原因。 main ( ) { int x=10,y=5,*px,*py; px=py; px=&x; py=&y; printf(“*px=%d,*py=%d”,*px,*py); } (2)调试下面程序。 #include main ( ) { float a; float *pa; scanf(“%f”,&a); printf(“1.%f\n”,a); pa=&a; scanf(“%f”,pa); printf(“2.%f\n”,a); } 在上述程序中,添加如下语句。 printf(“%x”,&a); printf(“%x”,pa); printf(“%x”,pa+1); ①记录这3条语句的输出值。其中“%x”表明输出的数值用十六进制数表示。 ②计算float类型所占空间的大小。 ③运算符sizeof可以计算出某一类型或变量所占存储空间的大小。请在上述程序中加入语句:printf(“%ld”,sizeof(float));将该语句的输出结果与步骤②的结果比较,观察是否一致。

(3)调试下面程序。 #include main ( ) { float a,b; float *pa=&a,*pb=&b; printf(“%x\n”,pa+pb); printf(“%x\n”,pa-pb); printf(“%x\n”,pa+5); printf(“%x\n”,pa-5); } 记录出错信息,分析出错原因。总结指针可以进行哪些运算。 下面的程序能获得上述运行结果吗? main( ) { char *s=”COMPUTER”; char c; printf(“which style you want to \n”); printf(“capital (c) or uncapital (u);”); c=getchar(); if (c=’c’) puts(s); else { s=”computer”; puts(s); } }

C语言中指针、数组和引用例子实例

一、指针:内容是指示一个内存地址的变量;类型是指示编译器怎么解释指针内容指向地址中的内容,以及该内存区域有多大; 例子: [cpp] int i = 0; int * pi = &i; printf(“pi = %x \n”, pi); // 打印pi的内容: 0x2000 printf(“*pi= %d \n” , *pi); // 打印pi指向地址中的值: 5 printf(“&pi= %x \n”, &pi); // 打印pi的地址: 0x100 从汇编的角度来看,指针是这样的: int i = 0; 010E139E mov dword ptr [i],0 int * pi = &i; 010E13A5 lea eax,[i] 010E13A8 mov dword ptr [pi],eax 二、数组:是一个单一数据类型对象的集合。其中单个对象没有被命名,通过索引访问。 数组名和指针的区别:数组名的内涵在于其指代实体是一种数据结构,这种数据结构就是数组。数组名的外延在于其可以转换为指向其指代实体的指针,而且是一个指针常量。指向数组的指针则是另外一种变量类型,仅仅意味着数组的存放地址 注意:虽然数组名可以转换为指向其指代实体的指针,但是它只能被看作一个指针常量,不能被修改,如下:天骄无双:https://www.wendangku.net/doc/6f5597157.html, [cpp] int intArray[10]; intArray++; // 错误 “指针和数组等价”说的是什么?索引操作相同,例如:p[2]; a[2]; 三、引用(reference)是一个对象的别名。用对象初始化引用后,对象的名字和引用都指向该对象; 引用是如何实现的?从汇编语言的角度来看,指针和引用是一样的: [cpp] int i = 0; 00E9139E mov dword ptr [i],0 int & ref = i; 00E913A5 lea eax,[i] 00E913A8 mov dword ptr [ref],eax int * pi = &i; 00E913AB lea eax,[i] 00E913AE mov dword ptr [pi],eax 指针和引用的区别(从C++使用角度来看): 不存在空引用 引用要初始化 引用初始化后,不能指向另一个对象 这是由编译阶段保证的。 备注:一个指向非常量的引用不能用字面值或者临时值初始化;但是一个指向常量的引用可以。天骄无双:https://www.wendangku.net/doc/6f5597157.html,

教材课后题答案-第6章_指针习题答案

习题解答 一、单项选择题 1.若定义了int n=2, *p=&n, *q=p;则下面【】的赋值是非法的。 A.p=q B. *p=*q C. n=*q D. p=n 【答案】D 2.若定义了double *p, a;则能通过scanf函数给输入项读入数据的程序段是【】。 A.p=&a; scanf(“%1e”,p); B. *p=&a; scanf(“%1f”,p); C. p=&a; scanf(“%f”,p); D. p=&a; scanf(“%1f”,a); 【答案】C 3.若定义了int a[10], i=3, *p; p=&a[5];下面不能表示为a数组元素的是【】。 A.p[-5] B. a[i+5] C. *p++ D. a[i-5] 【答案】D 4.若有如下定义: int n[5]={1,2,3,4,5},*p=n; 则值为5的表达式是【】。 A.*+5 B. *(p+5) C. *p+=4 D. p+4 【答案】C 5.设变量b的地址已赋给指针变量ps,下面为“真”的表达式是【】。 A.b==&ps B. b==ps C. b==*ps D. &b==&ps 【答案】C 6.设有以下定义和语句: int a[3][2]={1,2,3,4,5,6},*p[3]; p[0]=a[1]; 则*(p[0]+1)所代表的数组元素是【】。 A.a[0][1] B. a[1][0] C. a[1][1] D. a[1][2] 【答案】C 7.若定义了char *str=”Hello!”;下面程序段中正确的是【】。 A.char c[ ], *p=c; strcpy(p,str); B.char c[5], *p; strcpy(p=&c[1],&str[3]); C.char c[5]; strcpy(c,str); D.char c[5]; strcpy(p=c+2,str+3); 【答案】B 8.若有下面的程序段,则不正确的fxy函数的首部是【】。 main() { int a[20], n; … fxy(n, &a[10]); … } A.void fxy(int i, int j) B. void fxy(int x, int *y) C. void fxy(int m, int n[]) D. void fxy(int p, int q[10]) 【答案】A 9.不合法的带参数main函数的首部形式是【】。

第七章字符数组与指针练习题参考答案(2)

第七章字符数组与字符串 【题7.29】下面是对s的初始化,其中不正确的是。 A)char s[5]={“abc”};B)char s[5]={‘a’,‘b’,‘c’}; C)char s[5]=“”;D)char s[5]=“abcdef”; 【题7.30】下面程序段的运行结果是。 char c[5]={‘a’,‘b’,‘\0’,‘c’,‘\0’}; printf(“%s”,c); A)‘a’‘b’ B)ab C)ab c 【题7.31】对两个数组a和b进行如下初始化 char a[]=“ABCDEF”; char b[]={‘A’, ‘B’,‘C’,‘D’,‘E’,‘F’}; 则以下叙述正确的是。 A)a与b数组完全相同B)a与b长度相同 C)a和b中都存放字符串D)a数组比b数组长度长 提示:‘\0’是字符串结束的标志 【题7.32】有两个字符数组a、b,则以下正确的输入格式是。 A)gets(a,b); B)scanf(“%s %s”,a,b); C)scanf(“%s %s”,&a,&b);D)gets(“a”),get(“b”); 【题7.33】有字符数组a[80]和b[80],则正确的输出形式是。 A)puts(a,b); B)printf(“%s %s”,a[],b[]); C)putchar(a,b); D)puts(a),puts(b); 【题7.34】下面程序段的运行结果是。 char a[7]=“abcdef”; char b[4]=“ABC”; strcpy(a,b); printf(“%c”,a[5]); A)空格B)\0 C)e D)f 提示:复制后a[0]=‘A’,a[1]=‘B’,a[2]=‘C’,a[3]=‘\0’, a[4]=‘e’,a[5]=‘f’, a[6]=‘\0’,

C语言指针实验报告

C语言程序设计实验报告 1实验目得 (1)掌握指针得概念,会定义与使用指针变量; (2)能正确使用变量得指针与指向变量得指针变量; (3)能正确使用数组得指针与指向数组得指针变量; (4)能正确使用字符串得指针与指向字符串得指针变量; 2实验内容 将一个任意整数插入到已排序得整形数组中,插入后,数组中得数仍然保持有序; 要求: (1)整形数组直接由赋值得方式初始化,要插入得整数有scanf()函数数入; (2)算法实现过程采用指针进行处理; (3)输入原始数据以及插入整数后得数据,并加以说明;

3算法描述流程图

4源程序 #include main() { int a[100],m,i,*p,n,w; printf("请输入要输入得数组得元素个数:\n"); scanf("%d",&n); printf("请输入已排好序得数组:\n"); for(i=0;i=w;i--) { a[i+1]=a[i]; } a[i+1]=m; for(i=0;i<=n;i++) { printf("%-4d",a[i]); } printf("\n"); } 5测试数据 “1,3,5,7,9,11,13,15,17,19······10” 6运行结果 7出现问题及解决方法 在编写过程中,

for(i=n-1;a[i]>=w;i--) { a[i+1]=a[i]; } a[i+1]=m; 这一步没有注意a[i++]=m与a[i+1]=m中i++与i+1不同,a[i++]=m就是先将得值赋给a[i],然后在执行自增;而在实验过程中忽略了这一点,造成了不必要得麻烦; 8实验心得 通过这次指针实验掌握了指针得概念,会定义与使用指针变量,并且能利用指针来简单化一些问题,给以后得编程带来了很大得便利;

指针综合练习题(带答案)

指针综合练习题 一、选择题 1.若有以下定义,则对a数组元素的正确引用是____d_____. int a[5],*p=a; a)*&a[5] b)a+2 c)*(p+5) d)*(a+2) 2.若有定义:int a[2][3],则对a数组的第i行j列元素地址的正确引用为__d____. a)*(a[i]+j) b)(a+i) c)*(a+j) d)a[i]+j 3.若有以下定义,则p+5表示___a____. int a[10],*p=a; a)元素a[5]的地址b)元素a[5]的值 c)元素a[6]的地址d)元素a[6]的值 4.设p1和p2是指向同一个字符串的指针变量,c为字符变量,则以下不能正确 执行的赋值语句是____b____. a)c=*p1+*p2; b)p2=c c)p1=p2 d)c=*p1*(*p2); 5.若有说明语句 char a[]="It is mine"; char *p="It is mine"; 则以下不正确的叙述是___d_____. a)a+1表示的是字符t的地址 b)p指向另外的字符串时,字符串的长度不受限制 c)p变量中存放的地址值可以改变 d)a中只能存放10个字符 二、填空题 1 指针变量保存了另一变量的(1)值,不可以任意给指针变量赋一个地址值,只能赋给 它(2)和(3)的地址。使用变量名来访问变量,是按(4)来直接存取变量称为(5)方式;而借助指针变量取得另一变量的地址,访问该变量称为(6)方式。 答案:(1)地址 (2)NULL (3)已经分配了内存的变量的地址 (4)按变量的地址 (5)直接访问 (6)间接访问 2 以下程序的功能是:通过指针操作,找出三个整数中的最小值并输出。 请填空。 void main() {int *a,*b,*c,num,x,y,z; a=&x;b=&y;c=&z; cou<<"输入3个整数:"; cin>>a>>b>>c; cout<<*a<<*b<<*c; num=*a;

指针练习题

. 编程题 1用指向数组的指针变量输出数组的全部元素 2 使用函数调用,形参为指针,实参为数组,把一个数组逆序存放在输出 练习题: 一判断题 1.指针是变量,它具有的值是某个变量或对象的地址值,它还具有一个地址值,这两个地址值是相等的。 2.指针的类型是它所指向的变量或对象的类型。 3.定义指针时不可以赋初值。 4.指针可以赋值,给指针赋值时一定要类型相同,级别一致。5.指针可以加上或减去一个int型数,也可以加上一个指针。6.两个指针在任何情况下相减都是有意义的。 7.数组元素可以用下标表示,也可以用指针表示。 8.指向数组元素的指针只可指向数组的首元素。 9.字符指针是指向字符串的指针,可以用字符串常量给字符指针赋值。 10.引用是一种变量,它也有值和地址值。 11.引用是某个变量的别名,引用是被绑定在被引用的变量上。

12.创建引用时要用一个同类型的变量进行初始化。 13.指针是变量,它可以有引用,而引用不能有引用。 ;. . 二单选题 1.下列关于定义一个指向double型变量的指针,正确的是()。A.int a(5);double *pd=a; B.double d(2.5),*pd=&d;C.double d(2.5),*pd=d; D.double a(2.5),pd=d;。).下列关于创建一个int型变量的引用,正确的是(2A.int a(3),&ra=a; B int . a(3),&ra=&a;ra=a;D.int a(3), C.double d(3.1);int &rd=d;.下列关于指针概念的描述中,错误的是()。3 A.指针中存放的 是某变量或对象的地址值.指针的类型是它所存放的数值的类型 B .指针是变量,它也具有一个内存地址值 C .指针的值是可以改 变的D 。.下列关于引用概念的描述中,错误的是()4 A.引 用是变量,它具有值和地址值 B.引用不可以作数组元素 C.引用是变量的别名 D.创建引用时必须进行初始化。++*p相同的是()*p=a5.已知:int a[5],;则与a[0] . B.*++p A++a[0] .C*p++ D.;. . 6.已知:int a[ ]={1,2,3,4,5},*p=a;在下列数组元素地址的表

c语言指针实验报告

C语言实习报告 题目:指针及其应用 系别: 专业: 姓名: 学号: 日期:

一实验名称:指针及其应用 二实验目的: (1)掌握变量的指针及其基本用法。 (2)掌握一维数组的指针及其基本用法。 (3)掌握指针变量作为函数的参数时,参数的传递过程及其用法。 三实验内容: (1)运行以下程序,并从中了解变量的指针和指针变量的概念。 (2)运行以下程序,观察&a[0]、&a[i]和p的变化,然后回答以下问题: 1.程序的功能是什么? 2.在开始进入循环体之前,p指向谁? 3.循环每增加一次,p的值(地址)增加多少?它指向谁? 4.退出循环后,p指向谁? 5.你是否初步掌握了通过指针变量引用数组元素的方法? (3)先分析以下程序的运行结果,然后上机验证,并通过此例掌握通过指针变量引用数组元素的各种方法。

(4)编写函数,将n个数按原来的顺序的逆序排列(要求用指针实现),然后编写主函数完成: ①输入10个数; ②调用此函数进行重排; ③输出重排后的结果。 四分析与讨论: (1)指针的定义方法,指针和变量的关系。 定义方法: 数据类型 *指针变量名; 如定义一个指向int型变量的指针—— int *p;

则我们可以继续写如下代码—— int a = 4; p = &a; printf("%d", *p); 在这里,我们定义了一个变量a,我们把它理解为内存空间连续的4个字节(int型占用4字节),则这4个字节的空间保存着一个数4。&是取地址符号,即把变量a的地址(即这4个字节的首地址)赋给指针p (记住指针p的类型和变量a的类型要保持一致,否则的话,要进行类型转换)。这样子,指针p就保存着变量a的地址。我们如果把指针p当做内存空间里面另外一个连续的4个字节,那么这4个字节保存的数就是变量a的地址。printf("%d",*p)和printf("%d",a)的结果是一样的。这里的*是取变量符号(与&刚好作用相反,通过变量的地址找到变量),与定义时int *p的*号作用不同(定义时的*表示该变量是个 指针变量,而非是取它指向的变量)。 (2)数组和指针的关系。 指针与数组是C语言中很重要的两个概念,它们之间有着密切的关系,利用这种关系,可以增强处理数组的灵活性,加快运行速度,本文着重讨论指针与数组之间的联系及在编程中的应用。 1.指针与数组的关系 当一个指针变量被初始化成数组名时,就说该指针变量指向了数组。如: char str[20], *ptr; ptr=str; ptr被置为数组str的第一个元素的地址,因为数组名就是该数组的首地址,也是数组第一个元素的地址。此时可以认为指针ptr就是数组str(反之不成立),这样原来对数组的处理都可以用指针来实现。如对数组元素的访问,既可以用下标变量访问,也可以用指针访问。 2.指向数组元素的指针 若有如下定义: int a[10], *pa; pa=a; 则p=&a[0]是将数组第1个元素的地址赋给了指针变量p。 实际上,C语言中数组名就是数组的首地址,所以第一个元素的地址可以用两种方法获得:p=&a[0]或p=a。 这两种方法在形式上相像,其区别在于:pa是指针变量,a是数组名。值得注意的是:pa是一个可以变化的指针变量,而a是一个常数。因为数组一经被说明,数组的地址也就是固定的,因此a是不能变化的,不允许使用a++、++a或语句a+=10,而pa++、++pa、pa+=10则是正确的。由此可见,此时指针与数组融为一体。 3.指针与一维数组 理解指针与一维数组的关系,首先要了解在编译系统中,一维数组的存储组织形式和对数组元素的访问方法。 一维数组是一个线形表,它被存放在一片连续的内存单元中。C语言对数组的访问是通过数组名(数组的起始地址)加上相对于起始地址的相对量(由下标变量给出),得到要访问的数组元素的单元地址,然后再对计算出的单元地址的内容进行访问。通常把数据类型所占单元的字节个数称为扩大因子。 实际上编译系统将数组元素的形式a[i]转换成*(a+i),然后才进行运算。对于一般数组元素的形式:<数组名>[<下标表达式>],编译程序将其转换成:*(<数组名>+<下标表达式>),其中下标表达式为:下标表达式*扩大因子。整个式子计算结果是一个内存地址,最后的结果为:*<地址>=<地址所对应单元的地址的内容>。由此可见,C语言对数组的处理,实际上是转换成指针地址的运算。 数组与指针暗中结合在一起。因此,任何能由下标完成的操作,都可以用指针来实现,一个不带下标的数组名就是一个指向该数组的指针。

C语言数组指针的小例子

1、功能:输入6个学生的5门课程成绩,计算出每个学生的平均分和每门课程的平均分。 2、C语言实现代码:(其实就是用二维数组来实现的,二维数组的引用传递使用数组指针来完成) 复制代码代码如下: #include <stdio.h> #define STUDENT 5 #define SCORE 6 void input_array(float (*score)[STUDENT]); void avg_score(float (*score)[STUDENT]); void avg_course(float (*score)[STUDENT]); /** * calculate student average score and course average socore. */ int main(){ float a[SCORE][STUDENT]; input_array(a); avg_course(a); avg_score(a); } void input_array(float (*score)[STUDENT]){ int i, j; for(i=0; i<SCORE; i++){ printf("input the %d student score:", i+1); for(j=0; j<STUDENT; j++){ scanf("%f", score[i] + j); } } } void avg_course(float (*score)[STUDENT]){ int i,j; float s; for(j=0; j<STUDENT; j++){ printf("course%d ", j); } printf("n"); for(i=0; i<SCORE; i++){ s=0; for(j=0; j<STUDENT; j++){ printf("%f ", *(score[i] + j)); s += *(score[i] + j); }

指针练习题与答案

编程题 1用指向数组的指针变量输出数组的全部元素 #include void main( ) { int a[10], i; int *p; for (i=0; i<10; i++) cin>>a[i]; for (p=a; p 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 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<

【实验指导书】实验7:指针 (1)

(2014~2015学年-第1学期) 1. 理解指针、地址和数组间的关系。 2. 掌握通过指针操作数组元素的方法; 3. 掌握数组名作为函数参数的编程方式。 4. 掌握通过指针操作字符串的方法。 5. 了解掌握使用断点调试程序的方法。 二、实验环境: 操作系统:Window 8 编译环境:CodeBlock 13.02 三、实验要求及内容(根据实验要求,将整个实验过程需要的数据和截屏记录于此,并整理成实验步骤。): 1.设计一个程序计算输入的两个数的和与差,要求自定义一个函数sum_diff(float op1,float op2,float *psum,float *pdiff),其中op1和op2是输入的两个数,*psum和*pdiff是计算得出的和与差。 解: (1)流程图如图1所示: 图1 程序7-1的流程图

图2 实验7-1实验源代码 (3)运行结果(测试用例) 实验7-1运行结果如图3所示 图3 实验7-1运行结果 2. 输入n 个正整数,使用选择法将它们从小到大排序后输出。要求:利用所学指针的内容实现。 提示:在指针这一章所学的冒泡排序算法基础上改写。 解: (1)流程图如图1所示: 图1 程序7-2的流程图

图2 实验7-2实验源代码(3)运行结果(测试用例)实验7-2运行结果如图3所示 图3 实验7-2运行结果

3. 输入10个整数存入数组a ,再输入一个整数x ,在数组a 中查找x ,若找到则输出相应的下标,否则显示“Not found ”。要求定义和调用函数seach(int list[],int n ,int x),在数组list 中查找元素x ,若找到则返回相应的下标,否则返回-1,参数n 代表数组list 中元素的数量。试编写相应程序。 解:(1)流程图如图1 7-3的流程图 (2)源代码 源代码如图2所示

c语言指针GetMemory经典例子

GetMemory的典型例子 2010-01-13 18:24 520人阅读评论(2) 收藏举报//NO.1:程序首先申请一个char类型的指针str,并把str指向NULL(即str里存的是NULL的地址,*str为NULL中的值为0),调用函数的过程中做了如下动作:1申请一个char 类型的指针p,2把str的内容copy到了p里(这是参数传递过程中系统所做的),3为p指针申请了100个空间,4返回Test函数.最后程序把字符串hello world拷贝到str 指向的内存空间里.到这里错误出现了!str的空间始终为NULL而并没有实际的空间.深刻理解函数调用的第2步,将不难发现问题所在! void GetMemory(char *p) { p = (char*)malloc(100); } void Test(void) { char *str = NULL; GetMemory(str); strcpy(str, "hello world"); printf(str); } //请问运行Test函数后会是什么样的结果? //NO.2:程序首先申请一个char类型的指针str,并把str指向NULL.调用函数的过程中做了如下动作:1申请一数组p[]并将其赋值为hello world(数组的空间大小为12),2返回数组名p付给str指针(即返回了数组的首地址).那么这样就可以打印出字符串"hello world"了么?当然是不能的!因为在函数调用的时候漏掉了最后一步.也就是在第2步return数组名后,函数调用还要进行一步操作,也就是释放内存空间.当一个函数被调用结束后它会释放掉它里面所有的变量所占用的空间.所以数组空间被释放掉了,也就是说str所指向的内容将不确定是什么东西. char *GetMemory(void) { char p[] = "hello world"; return p;

c语言指针的习题答案

指针练习题 1.有以下程序 main() { char a[]="programming",b[]="language"; char *p1,*p2; int i; p1=a;p2=b; for(i=0;i<7;i++) if(*(p1+i)==*(p2+i)) printf("%c",*(p1+i)); } 输出结果是 A)gm B)rg C)or D)ga 2.设有说明int(*ptr)[m];其中的标识符ptr是 A)M个指向整型变量的指针 B)指向M个整型变量的函数指针 C)一个指向具有M个整型元素的一维数组的指针 D)具有M个指针元素的一维指针数组,每个元素都只能指向整型量 3.若已定义:int a[9],*p=a;并在以后的语句中未改变p的值,不能表示a[1] 地址的表达式是 A) p+1 B) a+1 C) a++ D) ++p 4.若有语句int *point ,a=4;和point =&a;下面均代表地址的一组选项是 A. a,point,*&a B. &*a,&a,*point C. &point,*point,&a D. &a,&*point,point 5.下面程序段的运行结果是 char a[]=”language”,*p;p=a; while(*p!=’u’) {printf(“%c”, *p-32);p++;} A. LANGUAGE B. LANGuage https://www.wendangku.net/doc/6f5597157.html,NG https://www.wendangku.net/doc/6f5597157.html,ngUAGE 6.以下程序的运算结果是*p=1,m=3,n=5 。 #include void main() {

int a[5]={1,2,3,-4,5}; int m,n,*p; p=&a[0]; m=*(p+2); n=*(p+4); printf("*p=%d,m=%d,n=%d",*p,m,n); } 7.写一通用函数slength,求出一个字符串的长度,并用main函数调用slength。解: #include #include int slength(char str[]) { int i; for(i=0;str[i]!='\0';i++); return i; } void main() { char string[50]; int len; printf("请输入字符串:"); gets(string); len=slength(string); printf("字符串长度是%d",len); } 8.若有定义:int a[2][3],则对a数组的第i行j列元素地址的正确引用为______. A)*(a[i]+j) B)(a+i) C)*(a+j) D)a[i]+j 9.若有以下定义,则p+5表示_______. int a[10],*p=a; a)元素a[5]的地址b)元素a[5]的值 c)元素a[6]的地址d)元素a[6]的值 8.下面程序的运行结果是_______. #include #include main()

相关文档