C 语言指针复习6
C语言指针经典练习题-及答案

C语言指针练习题及答案一、选择题1. 变量的指针,其含义是指该变量的____.a)值b)地址c)名d)一个标志2.若有语句int *point,a=4;和point=&a;下面均代表地址的一组选项是__ _.a)a,point,*&a b)&*a,&a,*pointc)*&point,*point,&a d)&a,&*point ,point3.若有说明;int *p,m=5,n;以下正确的程序段的是________.a)p=&n; b)p=&n;scanf("%d",&p); scanf("%d",*p);c)scanf("%d",&n); d)p=&n;*p=n; *p=m;4. 以下程序中调用scanf函数给变量a输入数值的方法是错误的,其错误原因是__ _____.main(){int *p,*q,a,b;p=&a;printf(“input a:”);scanf(“%d”,*p);……}a)*p表示的是指针变量p的地址b)*p表示的是变量a的值,而不是变量a的地址c)*p表示的是指针变量p的值d)*p只能用来说明p是一个指针变量5. 已有变量定义和函数调用语句:int a=25; print_value(&a); 下面函数的正确输出结果是______.void print_value(int *x){ printf(“%d\n”,++*x);}a)23 b)24 c)25 d)266.若有说明:long *p,a;则不能通过scanf语句正确给输入项读入数据的程序段是A) *p=&a;scanf("%ld",p);B) p=(long *)malloc(8);scanf("%ld",p);C) scanf("%ld",p=&a);D) scanf("%ld",&a);7.有以下程序#include<stdio.h>main(){ int m=1,n=2,*p=&m,*q=&n,*r;r=p;p=q;q=r;printf("%d,%d,%d,%d\n",m,n,*p,*q);}程序运行后的输出结果是A)1,2,1,2 B)1,2,2,1C)2,1,2,1 D)2,1,1,28. 有以下程序main(){ int a=1, b=3, c=5;int *p1=&a, *p2=&b, *p=&c;*p =*p1*(*p2);printf("%d\n",c);}执行后的输出结果是A)1 B)2 C)3 D)49. 有以下程序main(){ int a,k=4,m=4,*p1=&k,*p2=&m;a=p1==&m;printf("%d\n",a);}程序运行后的输出结果是()A)4 B)1 C)0 D)运行时出错,无定值10. 在16位编译系统上,若有定义int a[]={10,20,30}, *p=&a;,当执行p++;后,下列说法错误的是()A)p向高地址移了一个字节B)p向高地址移了一个存储单元C)p向高地址移了两个字节D)p与a+1等价11.有以下程序段int a[10]={1,2,3,4,5,6,7,8,9,10},*p=&a[3], b; b=p[5]; b中的值是()A)5 B)6 C)8 D)912.若有以下定义,则对a数组元素的正确引用是_________.int a[5],*p=a;a)*&a[5] b)a+2 c)*(p+5) d)*(a+2)13.若有以下定义,则p+5表示_______.int a[10],*p=a;a)元素a[5]的地址b)元素a[5]的值c)元素a[6]的地址d)元素a[6]的值14.设已有定义: int a[10]={15,12,7,31,47,20,16,28,13,19},*p; 下列语句中正确的是()A) for(p=a;a<(p+10);a++);B) for(p=a;p<(a+10);p++);C) for(p=a,a=a+10;p<a;p++);D) for(p=a;a<p+10; ++a);15.有以下程序段#include <stdio.h>int main(){ int x[] = {10, 20, 30};int *px = x;printf("%d,", ++*px); printf("%d,", *px);px = x;printf("%d,", (*px)++); printf("%d,", *px);px = x;printf("%d,", *px++); printf("%d,", *px);px = x;printf("%d,", *++px); printf("%d\n", *px);return 0;}程序运行后的输出结果是( )A)11,11,11,12,12,20,20,20 B)20,10,11,10,11,10,11,10C)11,11,11,12,12,13,20,20 D)20,10,11,20,11,12,20,2016.设有如下定义则程序段的输出结果为int arr[]={6,7,8,9,10};int *ptr;ptr=arr;*(ptr+2)+=2;printf ("%d,%d\n",*ptr,*(ptr+2));A)8,10 B)6,8 C)7,9 D)6,1017.若有定义:int a[]={2,4,6,8,10,12},*p=a;则*(p+1)的值是_4__. *(a+5)的值是__12__.18.若有以下说明和语句,int c[4][5],(*p)[5];p=c;能正确引用c数组元素的是___ __.A) p+1 B) *(p+3) C) *(p+1)+3 D) *(p[0]+2))19.若有定义:int a[2][3],则对a数组的第i行j列元素地址的正确引用为__ __.a)*(a[i]+j) b)(a+i) c)*(a+j) d)a[i]+j20.若有以下定义:int a[2][3]={2,4,6,8,10,12};则a[1][0]的值是_8_. *(*(a+1)+0)的值是_ _8.21.有以下定义char a[10],*b=a; 不能给数组a输入字符串的语句是()A)gets(a) B)gets(a[0]) C)gets(&a[0]); D)gets(b);22.下面程序段的运行结果是___ __.char *s="abcde";s+=2;printf("%d",s);a)cde b)字符'c' c)字符'c'的地址d)无确定的输出结果23.以下程序段中,不能正确赋字符串(编译时系统会提示错误)的是()A) char s[10]="abcdefg"; B) char t[]="abcdefg",*s=t;C) char s[10];s="abcdefg"; D) char s[10];strcpy(s,"abcdefg");24.设已有定义: char *st="how are you"; 下列程序段中正确的是()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);25.有以下程序输出结果是()main(){char a[]="programming",b[]="language";char *p1,*p2;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)ga26.设p1和p2是指向同一个字符串的指针变量,c为字符变量,则以下不能正确执行的赋值语句是_____.a)c=*p1+*p2; b)p2=c c)p1=p2 d)c=*p1*(*p2);27.以下正确的程序段是____.a)char str[20]; b)char *p;scanf("%s",&str); scanf("%s",p);c)char str[20]; d)char str[20],*p=str;scanf("%s",&str[2]); scanf("%s",p[2]);28.若有说明语句则以下不正确的叙述是____.char a[]="It is mine";char *p="It is mine";a)a+1表示的是字符t的地址b)p指向另外的字符串时,字符串的长度不受限制c)p变量中存放的地址值可以改变d)a中只能存放10个字符29.下面程序的运行结果是___.#include <stdio.h>#include <string.h>main(){ char *s1="AbDeG";char *s2="AbdEg";s1+=2;s2+=2;printf("%d\n",strcmp(s1,s2));}a)正数b)负数c)零d)不确定的值30.有以下程序运行后的输出结果是____。
C语言指针-练习

复习题(二)一、基础题1、设有:int k[]={2,4,6,8,10,12}, *p=k+2; 表达式*(p+2)*p[2] 的值:100 。
2、设有:int a[10], *p1, *p2; 则执行语句:p1=a; p2=&a[5]; 则p2-p1的值:5。
3、设有:int x[]={4,3,2,1},q,*p=&x[1];则执行语句:q=(*--p)++ ; 后;变量q的值为4。
4、设有:int *p, a=10, b=1; 则执行以下语句:p=&a; a=*p+b; 后;a的值为:11。
5、下列程序段的输出结果是2,1 。
int k=1, j=2, *p=&k, *q=p;p=&j;printf("%d, %d",*p, *q);6、设x为整型变量,p为指向整型的指针变量,则让p指向x变量的赋值表达式是P=&x。
7、设有变量定义:float d[]={1.0,2.0,3.0,4.0,5.0}, *p=d+3;请写出printf("\n %f %f", *p, d[0]); 的输出结果为:4.0和 1.0。
8、设有变量定义如下:char s[]="Hello!", *p=s; int i;执行完for(i=0; *(p+i); i++); 后,变量i的值是_6_;*(p+i)的值是‟\0‟_。
9、函数void f(char s[ ], char t[ ]){ int k=0;while (s[k]=t[k]) k++;}等价于void f(char *s, char *t)1、{ while (*s++=*t++); }二、选择题1、下面的程序段用来定义指针并赋值,请选出语法正确的程序段( C )。
A)int *p; scanf(“%d”,p); B)int *s,k; *s=100;C) int *s,k; D) int *s,kchar *p,*c; char *p,*c;s=&k; p=&c; s=&k; p=&c;*p=‟a‟; s=p; *s=1;2、程序段:int *p,a,b=1; p=&a; *p=10; a=*p+b; 执行后,a的值(B)。
C语言最重要的知识点复习资料(认真整理)

总体上必须清楚的:1)程序结构是三种:顺序结构, 循环结构(三个循环结构), 选择结构(if 和switch)2)读程序都要从main()入口, 然后从最上面顺序往下读(碰到循环做循环,碰到选择做选择)。
3)计算机的数据在电脑中保存是以二进制的形式. 数据存放的位置就是他的地址.4)bit是位是指为0 或者1。
byte 是指字节, 一个字节= 八个位。
5)一定要记住二进制如何划成十进制.概念常考到的:1、编译预处理不是C语言的一部分,不再运行时间。
C语言编译的程序称为源程序,它以ASCII数值存放在文本文件中。
2、每个C语言程序中main函数是有且只有一个.3、在函数中不可以再定义函数.4、算法的是一定要有输出的,他可以没有输入.5、break可用于循环结构和switch语句。
6、逗号运算符的级别最低.第一章1)合法的用户标识符考查:合法的要求是由字母,数字,下划线组成。
有其它元素就错了。
并且第一个必须为字母或则是下划线.第一个为数字就错了。
关键字不可以作为用户标识符号。
main define scanf printf 都不是关键字。
迷惑你的地方If是可以做为用户标识符。
因为If中的第一个字母大写了,所以不是关键字。
2)实型数据的合法形式:2.333e—1 就是合法的,且数据是2.333×10-1。
考试口诀:e前e后必有数,e后必为整数。
3)字符数据的合法形式::'1’ 是字符占一个字节,"1"是字符串占两个字节(含有一个结束符号)。
’0’ 的ASCII数值表示为48,’a’ 的ASCII数值是97,'A'的ASCII 数值是65。
4)整型一般是两个字节, 字符型是一个字节,双精度一般是4个字节:考试时候一般会说,在16位编译系统,或者是32位系统。
碰到这种情况,不要去管,一样做题.掌握整型一般是两个字节,字符型是一个字节,双精度一般是4个字节就可以了.5)转义字符的考查:在程序中int a = 0x6d,是把一个十六进制的数给变量a 注意这里的0x必须存在.在程序中int a = 06d,是一个八进制的形式.在转义字符中,’\x6d’ 才是合法的,0不能写,并且x是小写。
c语言指针试题

c语言指针试题
以下是一些关于C语言指针的试题,供您参考:
1.什么是指针?指针在C语言中的作用是什么?
2.指针变量如何声明和初始化?
3.指针运算符有哪些?它们的作用是什么?
4.指针如何进行算术运算和关系运算?
5.什么是空指针?如何声明和使用空指针?
6.指针如何进行类型转换?有哪些类型转换需要注意?
7.什么是函数指针?如何声明和使用函数指针?
8.什么是数组指针?如何声明和使用数组指针?
9.指针如何用于动态内存分配?有哪些常见的动态内存分配函数?
10.指针在使用中需要注意哪些问题?如何避免常见的指针错误?。
c语言中指针用法

1) 运算符 :*
该运算符作用在指针变量上,表示访问指针
变量所指向的数据对象编。辑课件
22
2)作用:
实现对指针所指向的数据对象的间接访问, 包括引用和赋值等基本运算。
例6-6 下面的程序段包含着对指针的间接访问。
int a,b=2,c,*p; …… p=&b; scanf("%d",&a); c=a+*p;
1.指针的赋值
操作指针之前必须赋予确定的值,可以在 定义指针的同时赋予初值,也可以用赋值表达 式对指针变量赋值。
(1)赋空值(NULL); (2)赋予某个变量的地址。 (3)将一个指针变量的值赋予另一指针变量。
例如:int grade,*p; 编辑课件
16
p=&grade;
2.指针的加减运算
1)运算符:+、-、++、-- 。
--:原地址减去一个地址单位(基类型的实际字 节数);
例如: int *iptr; …… iptr++;// iptr=iptr+1,向下移动两个字节 iptr--;// iptr=iptr-1,向上移动两个字节
下图给出指针的移动示编意辑课:件
19
3. 取地址运算
1) 运算符:& 2) 作用:获取数据对象的内存地址,如果是结 构数据对象则获取其内存首地址。
重点:
➢ 指针的概念 ➢ 指针运算; ➢ 内存操作函数和动态存储分配。
课堂时数:6—7学时 上机时数:2—3学时 课外上机时数:2—3学时
编辑课件
2
6.1 指针的概念
1. 什么叫指针
一个数据对象的内存地址称为该数据对象 的指针 。
《C语言》指针 ppt课件

ppt课件
14
p1 buf main
p bubfu+f105
p2 buf+10
aalllloocc
bbeeggiinn bubfu+f10 nn 150
ppt课件
1 buf[0]
2 buf[1]
:
:
9
:
\0 buf[9]
a buf[10]
:
:
\0 buf[14]
第6章 指针
6.1 指针定义与使用 6.2 指针与函数 6.3 指针与数组 6.4 指针与字符串 6.5 指针数组与多级指针 6.6 指针与动态内存分配 6.7 指针的深层应用
ppt课件
1
6.1 指针的引出
一. 地址与指针
1. 地址与取地址运算
C程序中的变量在内存中占有一个可标识的存储区,
d = *(++p) ; { ++p ; d = *p ; }
执行后 d 的值为 3 , *p 的值为 3
1010 23 a 5b 3c 3d
ppt课件
7
例6. 2
#include <stdio.h> void main( )
p1 &ba
5a
{ int *p1 , *p2 , *p , a , b ; scanf(“%d%d”, &a , &b);
p2 &ba
9b
p1 = &a ; p2 = &b ;
if (a<b) { p = p1 ; p1 = p2 ;
p &a
输出结果:
p2 = p ;
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分析:在变量类型说明语句中 *表示变量是指针变量,在其他语句中,*称为指针运算,用于访问指针所指向的对象的值,&称为取地址运算,用来得到一个对象的地址。
C语言指针详解

C语言指针详解1 程序如何运行当我们打开电脑中的任何一个程序运行时,我们的操作系统会将该程序存在硬盘的所有数据装载到内存中,然后有CPU 进行读取内存中的数据并进行计算,并将计算的结果返回给我们的操作系统,然后操作系统将相应的动作交付给相应的硬件来完成。
如:将声音数据交给声卡,最后有音响输出来,将图像交给显卡最后有显示器输出……但是还会有一部分数据会返回给内存,以供程序下面的语句继续使用。
我们都知道内存的容量有很大,如:4G,8G, 16G,有时候我们会打开很多的程序,所有的程序的数据都存放到我们的内存中,那么CPU是如何正确的读取我们的不同程序的数据并加以计算的哪?2 内存的假设设计为了让我们的CPU 可以很好的读取内存中的数据,内存必须做优化设计,于是给内存设定了集合设计,将我们的内存分成很多大小相同的方格(盒子),所有的数据将放入这些小盒子中,将不同的程序的数据放入到不同的小盒子中,这样就出现的模块化的内存,当我执行程序的一个命令时,CPU就会从相应的盒子读数据然后计算,由于我们硬件所能访问或计算的最小单位是字节,所以内存中的这样的一个小盒子的大小就给他规定一个字节。
3 地址和指针一般我们声明一块内存空间的时候,会给他取一个名字,为的是我们在编写程序的时候方便使用空间中存放的值,但是CPU 读数据的时候会忽视这个名字,因为CPU无法理解这样的数据,CPU 只能执行0,1代码,那么CPU是如何知道从什么地方读取数据,又到什么地方地址数据的读取的那,所以必须对内存做2次设计,就是将内存中分成的很多小盒子下面标注一些顺序的序号,例如:从第一个盒子开始,标注1,2,3,4,5,6,7,……每一个数字对应一个盒子,但是真正的内存如中不是使用这些十进制数字的,而是使用16进制整数表示的,如0x16ffee。
这些我们标记的数字就叫做内存中的地址。
由于这些地址和盒子是对应的关系,所以只要知道了地址,就可以得到对应盒子中存放的数据了,形象的说,我们说这个地址指向对应的盒子,在C语言中可以通过地址得到对应盒子的数据是*地址。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
此处*与类型名在一起 为定义指针变量。
指针指向变量 int a,*p; p=&a;
*p≡a 指针指向数组 int a[10],*p;
p=a
区别
数组名是地址常量(但是 形参数组名可当指针变量 用) 指针变量是地址变量
a[i] ≡*(a+i) ≡ p[i] ≡ *(p+i) // i变化 *p//p变化,p++,p--
char str[14]; str[]=”I love China!”; 错
char str[14]; strLeabharlann ”I love China!”; 错
数组名是地址常量
如果想把一个字符串从一个函数“传递”到 另一个函数?
可以用地址传递的办法: 字符数组名作参数 字符指针变量作参数
地址
void copy_string(char from[], char to[]) { int i=0; while(from[i]!='\0') 形参为数组名 { to[i]=from[i]; i++; } to[i]='\0'; 形参为指针 } void copy_string(char *from, char *to)
单个字符
scanf 以空格作为结束 gets 以回车作为结束 printf 输出没有自动换行 puts 输出自动换行
i=0; while((ch=getchar())!=„\n‟) c[i++]=ch; c[i]=„\0‟;
字符串的引用方式
(1)字符串是存放在字符数组中的。可以通 过数组名引用该字符串,也可以通过数组名和 下标引用字符串中一个字符。 (2) 用字符指针变量指向一个字符串常量, 通过字符指针变量引用字符串常量。
指针复习
区分指针变量与指针所指向的变量
int a,b,c; int *pointer_1=&a,*pointer_2=&b; pointer_1与pointer_2为指针变量, 用来存放地址:
pointer_1=址址; pointer_1=&c;
*pointer_1与*pointer_2为指针所指向的变量, 用来存放数据: *pointer_1=数据; *pointer_1=c+1;
实参和形参都用指针变量
*x//x变 x[i] *(x+i)
形参为数组名 void inv(int x[ ],int n) { int temp,i,j,m=(n-1)/2; for(i=0;i<=m;i++) { j=n-1-i; temp=x[i];x[i]=x[j];x[j]=temp; } 形参为指针 void inv(int *x,int n) } { int temp,*j; j=x+n-1; for( ; x<j; x++,j--) { temp=*x; *x=*j; *j=temp; } }
{ for( ;*from!='\0'; from++,to++)
{ *to=*from; *to='\0'; } }
指针和函数
实参与形参指 向同一个变量
实参:指针变量
主调函数
传递地址值 形参:指针变量 被调函数
实参与形参指 向同一个变量
int a=1,b=2; int *p1=&a,*p2=&b; swap(p1,p2)
a
主调函数:*p1,a 被调函数:*pt1
void swap(int *pt1, int *pt2)
char *string=“I love China!”;
string
string++; string
字符指针变量和字符数组的比较
char *a=”I love China!”;对
char *a; a=”I love China!”;对
char str[14]= ”I love China!”;对
形参和实参都用指针 形参数组名,实参指针 形参指针,实参数组名
总结数组与指针作为函数参数
如果有一个实参数组,想要在函数中改变 此数组中的元素的值,实参与形参的对应 关系有以下4种情况:
形参和实参都用数组名
x[i] *(x+i) *x//x变
总结数组与指针作为函数参数
如果有一个实参数组,想要在函数中改变 此数组中的元素的值,实参与形参的对应 关系有以下4种情况:
//printf(“%d ”,p[i]); //printf(“%d ”,a[i]); //printf(“%d ”,*(a+i);
数组名与指针作为函数参数
数组名与指针作为函数参数时,传递的是 数组的首地址,想要在函数中改变此数组 中的元素的值,实参与形参的对应关系有4 种情况:
形参和实参都用数组名
字符串的引用方式
(1)字符串是存放在字符数组中的。可以通 过数组名引用该字符串,也可以通过数组名和 下标引用字符串中一个字符。 区别 字符串
输入:scanf(“%s”,c); gets(c); 输出:printf(“%s”,c); puts(c); 输入:scanf(“%c”,&c[i]); c[i]=getchar(); 输出:printf(“%c”,c[i]); putchar(c[i]);
指针变量和函数
实参与形参指 向同一个变量
实参:指针变量
主调函数
传递地址值 形参:指针变量 被调函数 两个条件:
传递地址 引用指针所指变量的值(带*号)
通过形参指针变量,改变它们 所指向的变量的值(带*号)
scanf("%d",a+i); scanf("%d",p+i); #include <stdio.h> scanf("%d",&p[i]); for(p=a;p<(a+10);p++) int main() scanf("%d",p);
{ int a[10]; int *p,i; printf(“enter 10 integer numbers:\n"); for(i=0;i<10;i++) scanf("%d",&a[i]); for(p=a;p<(a+10);p++) printf(“%d ”,*p); printf("\n"); for(p=a,i=0;i<10;i++) return 0; printf(“%d ”,*(p+i)); }
实参用数组名,形参指针变量
*x//x变 *(x+i) x[i]
总结数组与指针作为函数参数
如果有一个实参数组,想要在函数中改变 此数组中的元素的值,实参与形参的对应 关系有以下4种情况:
实参指针,形参数组
x[i] *(x+i) *x//x变
总结数组与指针作为函数参数
如果有一个实参数组,想要在函数中改变 此数组中的元素的值,实参与形参的对应 关系有以下4种情况: