C语言基础题第六章:指针
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语言指针试题

c语言指针试题
以下是一些关于C语言指针的试题,供您参考:
1.什么是指针?指针在C语言中的作用是什么?
2.指针变量如何声明和初始化?
3.指针运算符有哪些?它们的作用是什么?
4.指针如何进行算术运算和关系运算?
5.什么是空指针?如何声明和使用空指针?
6.指针如何进行类型转换?有哪些类型转换需要注意?
7.什么是函数指针?如何声明和使用函数指针?
8.什么是数组指针?如何声明和使用数组指针?
9.指针如何用于动态内存分配?有哪些常见的动态内存分配函数?
10.指针在使用中需要注意哪些问题?如何避免常见的指针错误?。
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语言中可以通过地址得到对应盒子的数据是*地址。
c语言面试题__指针篇

c语言面试题__指针篇c语言面试题__指针篇1. char * const p;char const * pconst char *p上述三个有什么区别?char * const p; //常量指针,p的值不可以修改char const * p;//指向常量的指针,指向的常量值不可以改const char *p; //和char const *p------------------------------------------------------2. char str1[] = "abc";char str2[] = "abc";const char str3[] = "abc";const char str4[] = "abc";const char *str5 = "abc";const char *str6 = "abc";char *str7 = "abc";char *str8 = "abc";cout << ( str1 == str2 ) << endl;cout << ( str3 == str4 ) << endl;cout << ( str5 == str6 ) << endl;cout << ( str7 == str8 ) << endl;打印结果是什么?解答:结果是:0 0 1 1str1,str2,str3,str4是数组变量,它们有各自的内存空间;而str5,str6,str7,str8是指针,它们指向相同的常量区域-----------------------------------------------3. 以下代码中的两个sizeof用法有问题吗?void UpperCase( char str[] ) // 将 str 中的小写字母转换成大写字母{for( size_t i=0; i<="str[i]" )="" )<="" ++i="" if(="" p="" sizeof(str[0]);="" str[i]<="z">str[i] -= ('a'-'A' );}char str[] = "aBcDe";cout << "str字符长度为: " << sizeof(str)/sizeof(str[0]) << endl;UpperCase( str );cout << str << endl;答:函数内的sizeof有问题。
(完整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)。
(完整word版)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)26B) 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,1 C)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。
C语言指针用法详解

C语言指针用法详解C语言指针用法详解指针可以说是集C语言精华之所在,一个C语言达人怎么可以不会指针呢。
下面店铺给大家介绍C语言指针用法,欢迎阅读!C语言指针用法详解(1)关于指针与数组的存储a、指针和数组在内存中的存储形式数组p[N]创建时,对应着内存中一个数组空间的分配,其地址和容量在数组生命周期内一般不可改变。
数组名p本身是一个常量,即分配数组空间的地址值,这个值在编译时会替换成一个常数,在运行时没有任何内存空间来存储这个值,它和数组长度一起存在于代码中(应该是符号表中),在链接时已经制定好了;而指针*p创建时,对应内存中这个指针变量的空间分配,至于这个空间内填什么值即这个指针变量的值是多少,要看它在程序中被如何初始化,这也决定了指针指向哪一块内存地址。
b、指针和数组的赋值与初始化根据上文,一般情况下,数组的地址不能修改,内容可以修改;而指针的内容可以修改,指针指向的内容也可以修改,但这之前要为指针初始化。
如:int p[5];p=p+1; 是不允许的而p[0]=1; 是可以的;//int *p;p=p+1; 是允许的p[0]=1; 是不允许的,因为指针没有初始化;//int i;int *p=&i;p[0]=1; 是允许的;对于字符指针还有比较特殊的情况。
如:char * p="abc";p[0]='d'; 是不允许的为什么初始化了的字符指针不能改变其指向的内容呢?这是因为p 指向的是“常量”字符串,字符串"abc"实际是存储在程序的静态存储区的,因此内容不能改变。
这里常量字符串的地址确定在先,将指针指向其在后。
而char p[]="abc";p[0]='d'; 是允许的这是因为,这个初始化实际上是把常量直接赋值给数组,即写到为数组分配的内存空间。
这里数组内存分配在先,赋值在后。
(2)关于一些表达式的含义char *p, **p, ***p;char p[],p[][],p[][][];char *p[],*p[][],**p[],**p[][],*(*p)[],(**p)[],(**p)[][];能清晰地知道以上表达式的含义吗?(知道的去死!)第一组:char *p, **p, ***p;分别为char指针;char*指针,即指向char*类型数据地址的指针;char**指针,即指向char**类型数据的指针;他们都是占4字节空间的指针。
c语言指针的用法

c语言指针的用法c语言是一种高级编程语言,它可以直接操作内存中的数据。
指针是c语言中一种特殊的变量,它可以存储另一个变量的地址,也就是内存中的位置。
通过指针,我们可以间接地访问或修改内存中的数据,从而实现更高效和灵活的编程。
本文将介绍c语言指针的基本概念、定义和初始化、运算和应用,以及一些常见的错误和注意事项。
希望本文能够帮助你掌握c语言指针的用法,提高你的编程水平。
指针的基本概念指针是一种数据类型,它可以存储一个地址值,也就是内存中某个位置的编号。
每个变量在内存中都有一个唯一的地址,我们可以用指针来记录这个地址,然后通过这个地址来访问或修改变量的值。
例如,假设有一个整型变量a,它的值为10,它在内存中的地址为1000(为了简化,我们假设地址是十进制数)。
我们可以定义一个指向整型的指针p,并把a的地址赋给p,如下所示:int a =10; // 定义一个整型变量a,赋值为10int*p; // 定义一个指向整型的指针pp =&a; // 把a的地址赋给p这里,&a表示取a的地址,也就是1000。
p = &a表示把1000赋给p,也就是让p指向a。
从图中可以看出,p和a是两个不同的变量,它们占用不同的内存空间。
p存储了a的地址,也就是1000。
我们可以通过p 来间接地访问或修改a的值。
指针的定义和初始化指针是一种数据类型,它需要在使用前进行定义和初始化。
定义指针时,需要指定它所指向的变量的类型。
初始化指针时,需要给它赋一个有效的地址值。
定义指针的一般格式为:type *pointer_name;其中,type表示指针所指向的变量的类型,如int、char、float等;pointer_name表示指针的名称,如p、q、ptr等;*表示这是一个指针类型。
例如:int*p; // 定义一个指向整型的指针pchar*q; // 定义一个指向字符型的指针qfloat*ptr; // 定义一个指向浮点型的指针ptr注意,在定义多个指针时,每个指针前都要加*号,不能省略。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
。A
p++ ; } } 程序运行后的输出结果是 。 A、LANguage B、LANGUAge C、LAN D、LANGUA 16、有以下程序 C main( ) { char *p = " 1357 " ; p++ ; printf ("%c %s \n ", *p, p ); } 程序运行后的输出结果是 。 A、2 357 B、 2 1357 C、3 357 D、3 1357 二、填空题 1、下面程序段的运行结果是 14 , 13 。 int a[10]={2,4,6,8,10,12,14,16,18},*p; p=a+5; printf("%d , %d\n",*(p+1),*p+1); 2、若有以下定义和语句,在不移动指针 p 的情况下,可通过指针 p 引用值为 e 的数组元素的表达式是 * (p+3) 。 char c[7]={ 'a','b','c','d','e','f','g'}, *p ; p=c+1; 3、下面程序段的运行结果是 abABC , g 。 char s[20]="abcdefg", *p="ABC" ; strcpy( s+2, p ); printf ( " %s, %c \n" , s , s[6] ); 4、下面程序段的运行结果是 m , k 。 char a[10] = " acegikmoq ", *p ; p=a+3; p++; printf ("%c , %c \n ", *(p+2) , *p+2 ); 5、在 C 程序中,指针变量只能接受 变量的地址 值。 6、若有定义 int w[3]={1,2,3 }; ,则*(w+w[1] )的值是 3 。 7、若有定义 float a=3.14 , b , *p ; ,则执行语句“p=&b ; *p = a ; ”后 b 中的值是 3.14 。 8、以下程序运行后的输出结果是 18 。 #include <stdio.h> main( ) { int a[10]={1,2,3,4,5,6,7,8,9,10}; int i , *p, s=0; p=&a[0] ; for ( i=0 ; i<10 ; i++ ) if( ( *(p+i))%3==0 ) s=s+*(p+i) ; printf( "%d \n ",s ); } 9、执行下面的程序段后,a 数组中存放的内容是 cdefgh 。 char a[ ]="abcdef", *p; p=a; while ( *p !='\0' )
12、-1
1.若有初始化 char *str="student"; ,则 *(str+6) 的值是 。 A A、t B、空格 C、\0 D、不确定值 2.若有初始化 int a=2, *p ; ,则要使 p 指向 a 应使用的语句是 。 D A. *p=a; B. *p=&a; C. p=a; D. p=&a 3. 若有初始化 char a[ ]= " well " , *p = "well " ; ,则以下正确的叙述是 。 B A. 数组 a 的首地址和 p 中的值相同 B. a[1]和 p[1]的值相同 C. p 只能指向含有 4 个有效字符的字符串 D. a 中只能存放 4 个字符 4. 若有定义:int *p , *q, a=2, b ; ,则以下正确的赋值语句组是 。 D A. p=&a; *q=*p; B. *p=a; *q=b; C. p=&a;q=&b; *p=*q; D. p=&a;q=&b; *q=*p; 5. 若有定义: int a[5]={1,2,3,4,5,} , *p= a; 则以下表达式中值为 3 的是 。 B A. p+2 B. *(p+2) C. *(p+3) D. *p+3 6. 数组名代表数组的首地址,以下选项中可以对数组名进行的运算符是 。 B A. ++ B. + C.-D. = 7. 若有定义 int a [ 5 ]= { 1,2,3,4,5 } , *p=a+4 ; 则以下表达式中值为 3 的是 。 C A. a[3] B. &(p-2) C. *p-2 D. *(a+3) 8. 若有定义 int a [ ] = { 1,2,3,4,5,6,7,8,9,10 } , *p=a ; ,则对 a 数组元素的正确引用是 。 A A. *(p+3) B. *(P+10) C. p+1 D. ++*p 9. 若有定义 int a [5 ] = { 1,2,3,4,5 } , *p= a; ,则对数组元素地址的正确引用是 。 C A. *p+2 B. p[3] C. p+4 D. &a[5] 10. 若有定义 int *p1 , *p2 , a=3 ; ,则能够正确执行的语句是 。 A A. p1=&a; B. p2=a; C. *p1=a; D. *p2=*p1; 11、若有语句:char s1[ ]="language" , s2 [ 7 ], * s3, *s4="program"; ,则对库函数 strcpy 调用正确的是 A、strcpy(s1,s4); B、strcpy(s2,s4); C、strcpy(s3,s1); D、strcpy(s4,s1); 12、取地址运算符&,只能作用于 。 C A、常量 B、表达式 C、变量 D、整形变量 13、有以下程序 C #include <stdio.h> main ( ) { int a[10]={1,2,3,4,5,6,7,8,9,10}, *p,*q=NULL; p=a+6; q=p+4; printf("%d %d\n", *p,*q); } 程序运行后的输出结果是 。 A、6 不确定的数 B、6 10 C、7 不确定的数 D、7 10 14、若已对指针变量 p 正确定义和赋值,则语句:*p=*p+1;的正确含义是 。 D A、使这向后移动 1 个存储单位 B、使 p 所指存储单元中的值加 1 C、使 p 向后移动 2 个字节 D、使 p 的值加 1 15、有以下程序 C #include <stdio.h> main( ) { char a[ ]="language" , *p ; p=a; while (*p !='g') { printf (" %c" , *p-3p++ ; } 10、执行以下程序后的输出结果是 3 5 4 。 main( ) { char *s="13579"; s++ ; printf ( "%c,%c, %c \n" , *s , *(s+1) , *s+1 ) ; } 11、以下程序运行后的输出结果是 #BC#EF#H 。 main() { char a[ ]="ABCDEFGH ", *p = a ; int i=0 ; while (*p != '\0') { if ( i % 3 ==0 ) *p = '#' ; p++ ; i ++ ; } puts(a) ; } 12、下面程序的运行结果是 -1 (只需填写 1、零或-1) #include <stdio.h> #include <string.h> main() { char *s1="aBcDeF"; char *s2="AbCdEf"; s1=s1+3; s2=s2+3; printf("%d\n",strcmp(s2,s1)); } 三、判断题 1、若有定义:long a ; float * p ; ,则因为 long 型与 float 型都占 4 个字节,所以指针 p 可以指向 a。 F 2、若有初始化 char a[ 9 ]= " abc " , *p= "ABCD" ; 则语句 puts ( strcat (a,p+2) ) ; 的执行结果是 abcCD。 T 3、若有定义 char *p ;,则执行语句 p="abcde" ;后,p 中存放了字符串"abcde"。 F 4、若有定义 int a[10] , b[4][5] , *p; ,则国灰一维数组名和二维数组名都代表数组的首地址,所以“p=a;”和 “p=b;”都是正确的赋值语句。 F 四、改错题 1、下面程序的功能是交换变量 a 和 b 中的值。程序中有错误,请修改。 main( ) { int a ,b, *p,*q, *t ; p=&a; q=&b; 所有的*t 全改为 t, scanf("%d%d",p,q); pritnf(" 请输入变量 a 和 b 的值: "); scanf ("%d%d",&p,&q ); *t=*p; *p=*q ; *q=*t; printf( "交换后的 a 和 b 的值:%d %d\n ",a, b); }
参考答案: 单选题 1、A 2、D 3、B 4、D 12、C 13、C 14、D 15、C 填空题 1、14 13 2、*( p+3 ) 6、3 7、3.14 8、 18