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注意,在定义多个指针时,每个指针前都要加*号,不能省略。
C语言题库第6章指针
第六章指针一、单项选择1.若已定义char s[10];则在下面表达式中不表示s[1]的地址是()。
A.&s[1]B.&s[0]+1C.s+1D.s++2.下面程序段的运行结果是()。
char a[ ]=”language” , *p ;p=a ;while (*p!='u') { printf(“%c”,*p-32); p++ ; }nguagengUAGENGUAGENG3.下面能正确进行字符串赋值操作的是( )A.char s[5]={'A','B','C','D','E'};B.char s[5]={"ABCDE"};C.char *s ; s="ABCDE" ;D.char *s; scanf("%s",s) ;4.设p1和p2是指向同一个字符串的指针变量,c为字符变量,则以下能正确执行并得到有意义的结果的赋值语句是( )。
A.p2=c;B.c=*p1+*p2;C.p1=p2;D.c=*p1*(*p2);5.已有函数max(a,b),为了让函数指针变量p指向函数max,正确的赋值方法是( )。
A.*p=max(a,b);B.*p=max;C.p=max;D.p=max(a,b);6.以下正确的叙述是( )。
A.C语言允许main函数带形参,且形参个数和形参名均可由用户指定B.当main函数带有形参时,传给形参的值只能从命令行中得到C.若有说明: int main(int argc,char **argv),则argc的值必须大于1D.C语言允许main函数带形参,形参名只能是argc和argv7.若有定义:int (*p)[4];则标识符p( )。
A.是一个指针数组名B.定义不合法C.是一个指向整型变量的指针D.是一个指针,它指向一个含有四个整型元素的一维数组8.设有程序段:char s[ ]="china"; char *p ; p=s ;则下面叙述正确的是()。
《C语言》指针--ppt课件全文
说明: 这种方法可能会破坏系统的正常
工作状态,因为temp是一个指针变量 b 59
但是在函数中并没有给temp一个确定 的地址,这样它所指向的内存单元是 不可预见的,而对*temp的赋值可能 带来危害
swap2 &a p1
&b p2 随机值 temp
5?
ppt课件
11
例 6. 3 ③ #include <stdio.h> void swap3( int *p1, int *p2) { int *p;
p
*p = 12 ; printf (“%d\n” , *p ) ;
对a 重新赋值 等价于 a=12
2. & 与*
p =ห้องสมุดไป่ตู้&a ;
1010 152 a
&*p &(*p) &a *&a *(&a) *p a
ppt课件
6
3. *与 ++ , - -
int a = 2 , b = 5 , c , d , *p ; (1) p = &a ;
② 形参表列: 即指针变量所指向的函数的形参表列 ③ 格式中的小括号不能省略 2. 应用 (1) 让指针变量指向函数 pt = add ; 因为函数名为函数的入口地址, 所以直接将函数名 赋给指针变量即可 (2) 使用指针变量调用函数 格式 : (*指针变量名) ( 实参表列)
ppt课件
17
例 求一维数组中全部元素的和
因此我们可以定义一个指针变量, 让它的值等于 函数的入口地址, 然后可以通过这个指针变量来调用 函数, 该指针变量称为指向函数的指针变量
ppt课件
16
指向函数的指针变量
C语言指针知识点总结
C语⾔指针知识点总结1.指针的使⽤和本质分析(1)初学指针使⽤注意事项1)指针⼀定要初始化,否则容易产⽣野指针(后⾯会详细说明);2)指针只保存同类型变量的地址,不同类型指针也不要相互赋值;3)只有当两个指针指向同⼀个数组中的元素时,才能进⾏指针间的运算和⽐较操作;4)指针只能进⾏减法运算,结果为同⼀个数组中所指元素的下表差值。
(2)指针的本质分析①指针是变量,指针*的意义:1)在声明时,*号表⽰所声明的变量为指针。
例如:int n = 1; int* p = &n;这⾥,变量p保存着n的地址,即p<—>&n,*p<—>n2)在使⽤时,*号表⽰取指针所指向变量的地址值。
例如:int m = *p;②如果⼀个函数需要改变实参的值,则需要使⽤指针作为函数参数(传址调⽤),如果函数的参数数据类型很复杂,可使⽤指针代替。
最常见的就是交换变量函数void swap(int* a, int* b)③指针运算符*和操作运算符的优先级相同例如:int m = *p++;等价于:int m= *p; p++;2.指针和数组(1)指针、数组、数组名如果存在⼀个数组 int m[3] = {1,2,3};定义指针变量p,int *p = m(这⾥m的类型为int*,&a[0]==>int*)这⾥,其中,&m为数组的地址,m为数组0元素的地址,两者相等,但意义不同,例如:m+1 = (unsigned int)m + sizeof(*m)&m+1= (unsigned int)(&m) + sizeof(*&m)= (unsigned int)(&m) + sizeof(m)m+1表⽰数组的第1号元素,&m+1指向数组a的下⼀个地址,即数组元素“3”之后的地址。
等价操作:m[i]←→*(m+i)←→*(i+m)←→i[m]←→*(p+i)←→p[i]实例测试如下:1 #include<stdio.h>23int main()4 {5int m[3] = { 1,2,3 };6int *p = m;78 printf(" &m = %p\n", &m);9 printf(" m = %p\n", m);10 printf("\n");1112 printf(" m+1 = %p\n", m + 1);13 printf(" &m[2] = %p\n", &m[2]);14 printf(" &m+1 = %p\n", &m + 1);15 printf("\n");1617 printf(" m[1] = %d\n", m[1]);18 printf(" *(m+1) = %d\n", *(m + 1));19 printf(" *(1+m) = %d\n", *(1 + m));20 printf(" 1[m] = %d\n", 1[m]);21 printf(" *(p+1) = %d\n", *(p + 1));22 printf(" p[1] = %d\n", p[1]);2324return0;25 }输出结果为:(2)数组名注意事项1)数组名跟数组长度⽆关;2)数组名可以看作⼀个常量指针;所以表达式中数组名只能作为右值使⽤;3)在以下情况数组名不能看作常量指针:- 数组名作为sizeof操作符的参数- 数组名作为&运算符的参数(3)指针和⼆维数组⼀维数组的指针类型是 Type*,⼆维数组的类型的指针类型是Type*[n](4)数组指针和指针数组①数组指针1)数组指针是⼀个指针,⽤于指向⼀个对应类型的数组;2)数组指针的定义⽅式如下所⽰:int (*p)[3] = &m;②指针数组1)指针数组是⼀个数组,该数组⾥每⼀个元素为⼀个指针;2)指针数组的定义⽅式如下所⽰:int* p[5];3.指针和函数(1)函数指针函数的本质是⼀段内存中的代码,函数的类型有返回类型和参数列表,函数名就是函数代码的起始地址(函数⼊⼝地址),通过函数名调⽤函数,本质为指定具体地址的跳转执⾏,因此,可定义指针,保存函数⼊⼝地址,如下所⽰:int funcname(int a, int b);int(*p)(int a, int b) = funcname;上式中,函数指针p只能指向类型为int(int,int)的函数(2)函数指针参数对于函数int funcname(int a, int b);普通函数调⽤ int funcname(int, int),只能调⽤函数int func(int, int)函数指针调⽤ intname(*func)(int,int),可以调⽤任意int(int,int)类型的函数,从⽽利⽤相同代码实现不同功能,实例测试如下,假设有两个相同类型的函数func1和func2:1int func1(int a, int b, int c)2 {3return a + b + c;4 }56int func2(int a, int b, int c)7 {8return a - b - c;9 }普通函数调⽤和函数指针调⽤⽅式及结果如下所⽰1 printf("普通函数调⽤\n");2 printf("func1 = %d\n", func1(100, 10, 1));3 printf("func2 = %d\n", func2(100, 10, 1));4 printf("\n");56 printf("函数指针调⽤\n");7int(*p)(int, int, int) = NULL;8 p = func1;9 printf("p = %d\n", p(100, 10, 1));10 p = func2;11 printf("p = %d\n", p(100, 10, 1));12 printf("\n");需要注意的是,数组作为函数参数的时候,会变为函数指针参数,即:int funcname( int m[] )<——>int funcname ( int* m );调⽤函数时,传递的是数组名,即funcname(m);(3)回调函数利⽤函数指针,可以实现⼀种特殊的调⽤机制——回调函数。
指针的详细讲解
指针的详细讲解
指针是C语言中重要的概念,也是很多初学者比较困惑的一部分。
在C语言中,指针是一个特殊的数据类型,它直接或者间接地指向了另一个变量或者数据的地址。
指针的基本定义:指针是一个变量,其值是扮演着另一个变量名也就是地址的变量的地址。
指针与变量之间的区别在于,变量存储的是实际的值,而指针存储的是值的内存地址。
指针的类型:在C语言中,指针有不同的类型,这些类型标识了指针指向的变量的数据类型。
例如,int*是一个整数指针,而char*是一个字符指针。
指针的运算:指针可以进行加、减、前后移动等操作。
例如,指针加上一个整数就会指向另一个地址,指针减去一个整数就会回到前一个地址。
指针的使用:指针的主要作用是通过引用来访问变量或者数据。
通过指针,我们可以传递变量的地址而不是变量本身,这样可以减少内存的使用量并提高程序的效率。
指针的注意事项:在使用指针时,需要特别注意指针的安全性。
不正确的使用指针可能会导致内存泄漏、程序崩溃、数据丢失等问题。
总的来说,指针是C语言中一个非常重要的概念,理解它的基本概念和使用方法,对于C语言的学习和开发都有非常重要的意义。
c语言指针习题及答案
c语言指针习题及答案C语言指针习题及答案C语言作为一门广泛应用于软件开发和系统编程的编程语言,指针是其重要的特性之一。
掌握指针的使用对于理解和编写高效的C程序至关重要。
本文将介绍一些常见的C语言指针习题,并提供相应的答案,帮助读者更好地理解和掌握指针的概念和用法。
1. 习题一:交换两个变量的值请编写一个函数,接受两个整型指针作为参数,实现交换两个变量的值。
例如,如果输入a=10,b=20,函数执行后,a=20,b=10。
答案:```cvoid swap(int *a, int *b) {int temp = *a;*a = *b;*b = temp;}```2. 习题二:查找数组中的最大值和最小值请编写一个函数,接受一个整型数组和数组长度作为参数,返回数组中的最大值和最小值。
例如,对于数组[5, 2, 9, 1, 7],函数应该返回最大值9和最小值1。
答案:```cvoid findMinMax(int *arr, int length, int *max, int *min) {*max = *min = arr[0];for (int i = 1; i < length; i++) {if (arr[i] > *max) {*max = arr[i];}if (arr[i] < *min) {*min = arr[i];}}}```3. 习题三:计算字符串长度请编写一个函数,接受一个字符串作为参数,返回字符串的长度。
例如,对于字符串"Hello, World!",函数应该返回12。
答案:```cint stringLength(char *str) {int length = 0;while (*str != '\0') {length++;str++;}return length;}```4. 习题四:复制字符串请编写一个函数,接受两个字符串指针作为参数,将第一个字符串复制到第二个字符串中。
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)答案:D分析:因为C++语言表达式没有地址,A不正确。
C++语言普通变量不能用*运算,因此B和C也不正确。
&x表示变量x的地址,*&x是x 地址的值,所以D 正确。
B.*x C.&*x D.*&x例题4:若要建立如下关系,错误的语句组是( )。
spanstyle='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语言程序设计第6章 练习题
一、单项选择题题目1在下面的函数声明语句中存在着语法错误的就是( )。
a、AA(int, int)b、AA(int a; int b)c、AA(int a, int)d、AA(int a, int b)题目2如果一个函数定义仅允许为所在的程序文件调用,则应在该函数定义的最前面添加的关键字为( )。
a、externb、staticc、defaultd、auto题目3假定一个函数定义为“extern char* f1(char*x){return x;}”,表示该函数作用域的关键字为( )。
a、externb、charc、intd、char*题目4假定一个函数的原型语句为“int ff(int* x);”,一个整型数组为a[10],则下面函数调用表达式不正确的就是( )。
a、ff(a)b、ff(a[0])c、ff(&a[0])d、ff(a+3)题目5假定一个函数原型语句为“int f1(int a[],int n);”,与数组参数等价的表示为( )。
a、int** ab、int& ac、int* ad、int a题目6假定一个函数的参数说明为const int a,则在函数体中不能进行的操作就是( )。
a、a==0b、a=10c、printf("%d",a)d、intx=a题目7在函数体中定义的变量具有( )。
a、文件作用域b、局部作用域c、函数作用域d、全局作用域题目8在函数外定义的变量,若带有作用域关键字static,则它具有( )。
a、全局作用域b、文件作用域c、函数作用域d、局部作用域题目9在函数体中定义一个静态变量时,选用的存储属性关键字为( )。
a、staticb、registerc、externd、auto题目10假定一个函数原型为“void ff(int a[],int n)”,则对应的函数指针类型为( )。
a、*ff(int[],int)b、void(*ff)(int*a,int)c、void*ff(int*a,int)d、int (*ff)(int*a,int)二、判断题题目11函数定义格式中的参数表被称为实参表。
c语言指针编程题及详解
c语言指针编程题及详解c语言指针编程是一门用于编程的常见开发技术,通过指针的操作,可以让程序具备更强的表达能力,并且可以极大的减少代码的重复性。
根据其特性,以下列出了c语言指针编程的常见题目及详细解答:一、给定一个整型数组,使用指针把数组中的数字复制到另一个数组中相同的位置:解:#include<stdio.h>int main(){int *ptr1, *ptr2;int array1[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};int array2[10];ptr1 = array1; //设置指针1指向数组1的第一个元素ptr2 = array2; //设置指针2指向数组2的第一个元素while (ptr1<array1+10){ //当指针1指向的位置小于数组1的最后一个元素时,循环执行以下步骤*ptr2 = *ptr1; //将指针1指向的值赋值给指针2指向的位置ptr1++; //指针1指向下一个数组1中的元素ptr2++; //指针2指向下一个数组2中的元素}return 0;}二、给定两个整型数组,使用指针比较数组元素的大小:解:#include<stdio.h>int main(){int *ptr1, *ptr2;int array1[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};int array2[10] = {11, 12, 13, 14, 15, 16, 17, 18, 19, 20};ptr1 = array1; //设置指针1指向数组1的第一个元素ptr2 = array2; //设置指针2指向数组2的第一个元素while (ptr1<array1+10) { //当指针1指向的位置小于数组1的最后一个元素时,循环执行以下步骤if (*ptr1 > *ptr2) {printf("数组1元素大于数组2元素\n");} else if (*ptr1 < *ptr2) {printf("数组1元素小于数组2元素\n");} else {printf("数组1元素等于数组2元素\n");}ptr1++; //指针1指向下一个数组1中的元素ptr2++; //指针2指向下一个数组2中的元素}return 0;}三、用指针计算数组的最大值及最小值:解:#include<stdio.h>int main(){int *ptr, max, min;int array[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};//定义指针及最大最小值变量ptr = array;max = *ptr;min = *ptr;//开始循环比较for (ptr=array; ptr<array+10; ptr++){if (*ptr > max) {max = *ptr; //将指针指向元素的值与最大值进行比较,如果指向元素的值大,在赋值给最大值}if(*ptr < min){min = *ptr; //将指针指向元素的值与最小值进行比较,如果指向元素的值小,在赋值给最小值}}printf("max is %d , min is %d\n", max, min); return 0;}四、从指定的字符组件中取得字符串:解:#include <stdio.h>int main(){char arr[12] = "Hello World!", *str;str = &arr[6];printf("String is : %s\n", str);return 0;}。
大学C语言实用教程(课件)-第6章-指针
int *p=&a;
// p指向a
printf("a=%p b=%p c=%p p=%p\n",&a,&b,&c,&p); printf("p=%p *p=%d\n",p,*p);
p--;
}
// p指向a前面的存储单元
printf("p=%p *p=%d\n",p,*p);
2. 指针与整数相加减 指针加减一个整数n可以使指针移动,可以访问新地址。
char c= 'A',*pc=&c; float a=3.0,*pa=&a;
指针变量指向变量示意图
pa FF74 FF70 FF71 FF72 FF73 FF74 a 3.0 FF75 FF76 FF77 FF78 pc FF7C FF79 FF7A FF7B c A FF7C
② 赋值方法 先定义指针,然后用赋值语句将所指变量的地址赋给它。例如 char c,*pc;
4. 两个同类型指针相减
x[0]
如果两个同类型指针之间所存储的数据的 x[2] 类型也与指针相同(通常是数组的情况),则相 减的结果是这两个指针之间所包含的数据个数。 x[3]
x[4]
x[1]
【例】两个同类型指针相减。 #include <stdio.h> void main() { float x[10]; float *p,*q; p=&x[2]; q=&x[8]; printf("q-p=%d\n",q-p); }
6.1.2 指针和指针变量
1.指针和指针变量的概念
变量的指针:该变量在内存中的地址。 指针变量:专门用来存放变量地址的特殊变量。 在不致引起混淆的情况下,把指针变量简称为指针。
C语言指针习题及答案
指针主要内容的习题及答案一.选择题1.变量的指针,其含义是指该变量的 B 。
A)值B)地址C)名D)一个标志2.已有定义int k=2;int *ptr1,*ptr2;且ptr1和ptr2均已指向变量k,下面不能正确执行的赋值语句是 B 。
A)k=*ptr1+*ptr2 B)ptr2=k C)ptr1=ptr2 D)k=*ptr1*(*ptr2) 3.若有说明:int *p,m=5,n;以下程序段正确的是 D 。
A)p=&n ; B)p = &n ;scanf(“%d”,&p); scanf(“%d”,*p);C)scanf(“%d”,&n); D)p = &n ;*p=n ; *p = m ;4.已有变量定义和函数调用语句:int a=25;print_value(&a);下面函数的输出结果是 D 。
void print_value(int *x){ printf(“%d\n”,++*x); }A)23 B)24 C)25 D)265.若有说明:int *p1, *p2,m=5,n;以下均是正确赋值语句的选项是C 。
A)p1=&m; p2=&p1 ; B)p1=&m; p2=&n; *p1=*p2 ; C)p1=&m; p2=p1 ; D)p1=&m; *p1=*p2 ;6.若有语句:int *p,a=4;和p=&a;下面均代表地址的一组选项是D 。
A)a,p,*&a B)&*a,&a,*p C)*&p,*p,&a D)&a,&*p,p 7.下面判断正确的是 C 。
A)char *a=”china”; 等价于char *a; *a=”china” ;B)char str[10]={“china”}; 等价于char str[10]; str[ ]={“china”;}C)char *s=”china”; 等价于char *s; s=”china” ;D)char c[4]=”abc”,d[4]=”abc”; 等价于char c[4]=d[4]=”abc” ;8.下面程序段中,for循环的执行次数是 C 。
C语言6-指针
int a; int *p1; 指针p1 变量a
&a 目标变量p1
P1=&a;
&运算和*运算
&运算和*运算都属于单目运算,&要求运算量是变量或数
组元素,(取地址运算符)其形式为: & 变量名或数组元素名 其含义为取指定变量或数组元素的地址 *运算符要求运算量是地址,(指针运算符——间址运 算符)其形式为: *指针变量名或目标变量地址 含义为访问指定地址的目标变量 如: int i , j; int *p_1 , *p_2; p_1=&i; p_2=&j;
可见,指针p±n的运算并非内存地址含义上的运 算,而是C语言含义的地址运算。这种运算,一般 应在相同数据类型的存储区域上操作才有实际意 义,因此指针和数组关系密切,后图表示了这种 情况。
int a[40],*pa; pa-4 pa-3 pa-2 pa-1 pa pa+1 pa+2 pa+3 pa+4 a[ i –4] a[ i –3] a[ i –2] a[ i -1] a[ i ] a[i+1] a[i+2] a[i+3] a[i+4] (pa-4) (pa-3) (pa-2) (pa-1) pa (pa+1) (pa+2) (pa+3) (pa+4) 2004 2006 2008 2010 2012 2014 2016 2018 2020
运行情况如下: a=5,b=9 max=9,min=5
注: 程序中,a和b的值并未改变,但a1、a2的值已经改变, 因为程序始终让a1指向较小者,a2指向较大者,算法采取不 交换整型变量的值而交换指针变量的值的方法。 使用指针处理数据时,指针在使用前必须被赋予一定的地址 值或指定为空指针。一个没有赋值的指针其指向是不定的。 使用指针未定的指针接收数据时,常常会破坏内存中其它领 域的内容,甚至造成系统失控,应注意避免。例如下面对指 针p的使用是不恰当的:
c语言指针例题及解析
c语言指针例题及解析题目:已知 char **p 指向一个字符指针数组的首地址,其中数组的每个元素指向一个字符串,要求将数组中的字符串按顺序输出。
解析:首先,需要理解指针的指针的含义。
在 C 语言中,指针的指针是指向指针的指针,即一个指针变量中存储的是另一个指针变量的地址。
在本题中,char **p 指向一个字符指针数组的首地址,即 p 是一个指向指针的指针变量。
接下来,需要了解如何通过指针访问数组元素。
在 C 语言中,可以通过解引用运算符 * 来访问指针所指向的内容。
在本题中,数组的每个元素指向一个字符串,因此可以通过*p[i] 来访问第 i 个字符串。
最后,需要使用 printf 函数输出字符串。
在 C 语言中,printf 函数用于格式化输出,可以通过 %s 格式化符来输出字符串。
根据以上解析,可以使用以下代码实现题目要求的功能:c#include <stdio.h>int main() {char *strs[] = {"hello", "world", "C","language"};char **p = strs; // p 指向 strs 的首地址// 输出每个字符串for (int i = 0; i < 4; i++) {printf("%s\n", *p[i]); // 通过解引用运算符 * 来访问第 i 个字符串}return 0;}在上面的代码中,首先定义了一个字符指针数组 strs,其中包含了四个字符串。
然后定义了一个指向指针的指针变量 p,并将其初始化为 strs 的首地址。
接下来使用 for 循环遍历数组中的每个字符串,并使用 printf 函数输出每个字符串。
在输出时,通过解引用运算符 * 来访问第 i 个字符串。
最后返回 0 表示程序正常退出。
- 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