网站流量分析指标,网络教学平台昆明理工大学,网站认证怎么认证,网络有哪些广告推广方式C语言笔试例题_指针专练30题(附答案解析) 指针一直是C语言的灵魂所在#xff0c;是掌握C语言的必经之路#xff0c;收集30道C语言指针题目分享给大家#xff0c;测试环境位64位ubuntu18.04环境#xff0c;如有错误#xff0c;恳请指出#xff0c;文明讨论#xff01;是掌握C语言的必经之路收集30道C语言指针题目分享给大家测试环境位64位ubuntu18.04环境如有错误恳请指出文明讨论 文章目录 C语言笔试例题_指针专练30题(附答案解析)1.笔试例题2.结果与分析总结 1.笔试例题
答案与解析在文末尾 1.char * p “Hello”;是定义初始化指针变量,指针变量的值是一个字符串.说法是否正确
A 正确
B不正确 2.以下代码printf 输出是什么
void main (void)
{int a[]{4,5,6,7,8};int *p a;*p 100;printf( %d %d \n , *p,*(p));
}3.若定义:int a[2][3]{1,3,5,7,9,11},以下描述正确的是
A *(a1)为元素7的地址
B(a[1]1)的值是5
C**(a 1)2值是11
Da[0]和a不同 4.以下代码printf 输出是什么
int main()
{int a[5] { 1, 2, 3, 4, 5 };int* ptr (int*)(a 1);printf(%d,%d, *(a 1), *(ptr - 1));return 0;
}5.说出以下代码的错误之处并说明原因
char *getmemory( void )
{char p[] hello world;return p;
}void test( void )
{char *str NULL;str getmemory();printf( str );
}6.在上下文及头文件均正常的情况下下列代码的输出是注print已经声明过
main()
{ char str[] Geneius;print (str);
}
print(char *s)
{if(*s){print(s);printf(%c, *s); }
}A suiene
Bneius
Crun-time error
DsuieneG 7.如下代码是否存在风险并说明原因和修改方式
#include stdio.h
int main () {//hello world 存放在常量区是不可以修改的char * str hello world; *str a; // errorreturn 0;
}8.如下代码是否可行说明原因
#include stdio.h
int main () {char str[4];str abc;return 0;
}9.如下代码输出是什么
#include stdio.h
#include string.hint main(){char *str baidu.com;int i ;str hello world!;int len strlen(str);printf(%d \n,len);printf(%c \n, *(str4));printf(%s \n,(str6));return 0;
}10.以下程序的输出结果32位机器上是
int main(){char *p abcdefgh, *r;long *q;q (long*)p;q;r (char*)q;printf(%s\n, r);
}A abcd
Bbcde
Ccdef
Defgh 11.对于char * pa[7]的描述中正确的是
A pa是一个指向数组的指针所指向的数组是7个char型元素
Bpa是一个指向某数组中第7个元素的指针该元素是char型变量
Cpa[7]表示数组的第7个元素的值是char型的值
Dpa是一个具有7个元素的指针数组每个元素是一个char型指针 12.如下代码输出是什么
#include stdio.h
void fun(char **p) {int i;for (i 0; i 4; i)printf(%s, p[i]);
}
main() {char *s[6] {ABCD, EFGH, IJKL, MNOP, QRST, UVWX};fun(s);printf(\n);
}A ABCDEFGHIJKL
BABCD
CAEIM
DABCDEFGHIJKLMNOP 13.test.c文件中包括如下语句文件中定义的四个变量哪个变量不是指针类型
#define INT_PTR int*
typedef int* int_ptr;
INT_PTR a,b;
int_ptr c,d;A a
Bb
Cc
Dd
E都是
F都不是 14.有int s[2]{0,1}, * ps; 则下列错误的C语句是 A s1;
Bp1;
C*p;
D(*p); 15.请问下列代码的输出是多少
#include stdio.h
int main() {int m[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};int(*p)[4] (int(*)[4])m;printf(%d, p[1][2]);return 0;
}A 7
B3
C8
D4 16.已知如下代码
int a[] {1, 2, 3, 4, 5};
int*p[] {a, a 1, a 2, a 3};
int **q p;表达式*(p[0]1)**(q2)的值是____。 A 5
B6
C7
D8
E9
F10 17.如下代码输出是什么
#includestdio.h
void foobar(int a, int *b, int **c)
{int *p a;*p 101;*c b;b p;
}int main()
{int a 1;int b 2;int c 3;int *p c;foobar(a, b, p);printf(a%d, b%d, c%d, *p%d\n, a, b, c, *p);return (0);
}A a1, b2, c3, *p2
Ba101, b2, c3, *p2
Ca101, b101, c2, *p3
Da1, b101, c2, *p3 18.如下代码输出是什么
void GetMemory(char **p, int num)
{*p (char *)malloc(num);
}
void Test(void)
{char *str NULL;GetMemory(str, 100);strcpy(str, hello);printf(%s, str);
}A 空
Bhello
C出错 19.如下代码输出是什么
int main(){int i 10;int j 1;const int *p1;//(1)int const *p2 i; //(2)p2 j;//(3)int *const p3 i;//(4)*p3 20;//(5)*p2 30;//(6)p3 j;//(7)
return 0;
}A 1234567
B1356
C67
D35 20.在C中为了建立如图所示的存储结构(即每个结点含两个域,data是数据域,next是指向结点的指针域),则在[] 处应填入选项是多选题
struct link
{
char data;
[];
} node;A link next;
Bstruct link * next;
Clink * next;
Dstruct link next; 21.有以下语句多选
char str[4][12] {aaa, bbbb, ccccc, dddddd}, *strp[4];
for (int i 0; i 4; i)strp[i] str[i];对字符串的正确引用是其中0≤k4 A *strp
Bstrp
Cstr[k]
Dstrp[k] 22.在64位系统下分别定义如下两个变量char ∗ * ∗p[10]; char( ∗ * ∗p1)[10];请问sizeof( p p p)和sizeof (p1)分别值为____。
A 4,40
B80,8
C10,10
D8,80 23.若有以下说明和定义在必要的赋值之后对fun函数的正确调用语句是
int fun (int *c){ … }
int main(){int (*a)(int*)fun,*b(),w[10],c;…
}A aa(w)
B(*a)(c)
Cb*b(w);
Dfun(b); 24.下列程序的打印结果是?
char p1[15] abcd, *p2 ABCD, str[50] xyz;
strcpy(str 2, strcat(p1 2, p2 1));
printf(%s, str);A xyabcAB
BabcABz
CABabcz
DxycdBCD 25.对于下面的语句
int c[4][5], (*p)[5];
p c;A p 1
B*(p 3)
C*(p 1) 3
D*(p[0] 2) 26.对于以下代码char ∗ * ∗ pnew char[100];说法正确的是
A p和new出来的内存都在栈上
Bp和new出来的内存都在堆上
Cp在堆上new出来的在栈上
Dp在栈上new出来的在堆上 27.运行以下C语言代码输出的结果是
#include stdio.h
int main()
{char *str[3] {stra, strb, strc};char *p str[0];int i 0;while(i 3){printf(%s ,p);i;}return 0;
} A stra strb strc
Bs t r
Cstra tra ra
Ds s s 28.运行以下C语言代码输出的结果是
int main()
{char c, s[20];strcpy(s, Hello,World);printf(s[]%6.9s\n, s);return 0;
}A s[]Hello,
Bs[]Hello,World
Cs[] Hello,
Ds[]Hello,Wor 29.有以下语句定义,则能输出a[1][2]的值的语句是
int a[2][3];
int (*p)[3]a;
int *q*a;Acout ∗ * ∗( ∗ * ∗(a1)2)
Bcoutp[1][2];
Ccout*(q5);
Dcoutq[1][2]; 30.若有定义语句 int year1009 ∗ * ∗pyear 以下不能使变量 year 中的值增至 1010 的语句是
A*p1;
B(*p);
C(*p)
D*p 2.结果与分析 题目一答案错误 , 原因char * p “Hello” 定义了一个指向字符串的指针变量 p并将其初始化为字符串 “Hello” 的地址。所以指针变量的值为字符串的地址 题目二答案6,6 原因执行*p 100语句之后数组变成{1045678}p指针指向第个二元素5重点是考察的是变参函数printfprintf的参数入栈是从右到左执行的所以先执行 ∗ * ∗(p)输出6再 执行 ∗ * ∗p输出6输出的是同一个元素。此题答案之前出现分歧可能是运行环境不一致导致的。 题目三答案A 原因在二维数组中 ∗ * ∗(a1)表示第二列首元素地址这里是7(a[1]1)表示第二列第二个元素的地址这里应该是元素9的地址**(a 1)表示第二列首元素求值这里是72得到的是9a和a[0]其实是一样的。一维数组和二维数组运算关系可参见博客https://blog.csdn.net/Yin_w/article/details/131731082 题目四答案2,5 原因因为a是整个数组a的地址所以a1指向的是整个数组a后面的一个位置跨越了整个数组也就是ptr指向的是数组a之外的下一个位置。而由于数组a是连续存储的所以这个位置恰好是数组a最后一个元素的下一个位置。因此 ∗ * ∗(ptr-1)的值就是数组a中最后一个元素的值即5 题目五答案运行结果运行无误但打印乱码 原因getMemory(void)中的p[]为函数内的局部自动变量在函数返回后内存已经被释放。如果一步步调试会发现执行strgetMenory();后str不再是NULL了但是str的内容并不是hello world而是垃圾数据。 题目六答案A 原因主要考察递归思想此题答案来自牛客网码友鸣谢 题目七答案运行会报错 原因这种形式的字符串存储在常量区。常量区 字符串只有读取权限没有写入权限这就导致了字符数组 在定义后可读取和修改每个字符而 第二种形式字符串常量 一旦定义后便不可修改对它的赋值都是错误的可整体赋值这种形式可修改 char str[] “hello world”; char *pstr str; *str ‘a’; 题目八答案赋值方式错误 原因字符数组 只有在定义时才可一次性赋值一旦定义完就只能一个个赋值。这样写正确str[0] ‘a’; str[1] ‘b’; str[2] ‘c’;与上述第七题的联系和区别可参见博客https://blog.csdn.net/Yin_w/article/details/132426333 题目九 答案 12 o world! 原因字符数组是一个数组关于指针和数组的规则同样也适用于字符数组.故输出字符串也可以用 ∗ * ∗(pstri)、pstr[i]、*(stri) 、str[i]进行输出 题目十答案D 原因char* p “abcdefgh”每个字符占1个字节那么总共是8个字节此时p指向’a’。如果是p那么p将指向’b’。打印p会得到bcdefgh。 long* q (long*)p 将p强制转换为long*类型也就是用long类型去解释存储了abcdefgh的这一段内存此时q指向’a’由于long类型是4个字节那么q移动4个字节q将指向’e’打印q将得到efgh。 题目十一答案D 原因这里定义的是一个指针数组本质是一个数组数组元素为指针 题目十二答案D 原因以上语句定义了一个指针数组 s。本质是一个数组数组元素为字符串指针而数组名是指向第一个元素的常量指针因此 s 是指向指针的指针所以函数 fun 的形参定义是 char **。fun(s) 将指针 s 的值传递给形参 p所以 p s因此for(i0;i4;i )printf(“% s”,p[i]);中 printf(“% s”,p[i]) 等价于 printf(“% s”,s[i])。注意 s[i] 中存储的不是字符串而是字符类型的指针但 printf 会输出 s[i] 存储的指针指向的字符串。所以最后输出为 D。 题目十三答案B 原因typedef 给已有类型声明一个别名故c和d都是int_ptr类型也即都是int *类型 #define宏定义在预编译时直接进行简单替换即原式变为int ∗ * ∗ a,b; 这相当于是int *a, int b; 即a是指针b是int型。参考博客https://blog.csdn.net/Yin_w/article/details/134915018?spm1001.2014.3001.5502 题目十四答案A 原因数组名为指针常量其值不可更改。 题目十五答案A 原因int ∗ * ∗p[n] 表示的是指针数组int ( ∗ * ∗p)[n] 表示的是一个指向有n个元素数组的指针(int ( ∗ * ∗)[4])m 表示以数组指针重新组织数组m将其每4位划为一组这样一来m为1234567890 p指向第一行故p[1][2]即 ∗ * ∗ ∗ * ∗p12表示第二行第三个元素为7 题目十六答案A 原因a[]是一个有5个元素的数组 ∗ * ∗p[]是一个指针数组数组名p其内部有4个元素每个元素是一个指针分别指向aa|a十2a十3。 ∗ * ∗(p[0]1)表示数组p的第0行第1个元素的值即a[l]值为2。 ∗ * ∗ ∗ * ∗q是一个二维指针它是向p的首址即p[0]0即a的首地址a[0]。q2表示指向a的第2个元素**表示取值3。所以答案5 题目十七答案A 原因函数对a是值传递所以int *p a得到的是形参的地址不会改变a的实际值“*p 101”是把形参a的值变成了101对**c传入的是二级指针所以“ ∗ * ∗c b”改变了指针p的指向现在p指针指向b所以p取值是2但c的值没有变依旧是3对于b p;相当于改变指针的指向对于一级指针来讲想在函数内部改变其指向是无效的所以b的值其实也没变整个过程下来其实改变的只有p的指向所以选A。可以参考博客https://blog.csdn.net/Yin_w/article/details/132478099 题目十八答案B 原因这里对传入的参数是二级指针但因为该函数形参p为实参的临时拷贝在函数内部申请空间的地址存放在p中不会影响str所以当函数返回之后str会成功指向开辟的堆空间但一定要记得释放此题有区别于void GetMemory(char *p, int num)形式。 题目十九答案C 原因 1const int ∗ * ∗p1不能通过指针p1修改指向的内存的值但p1本身指向可修改。 2int const ∗ * ∗p2i与p1相同即不能修改p2指向的内存单元的值但是可以修改p2使其指向其它的内存单元。这里p2指向了整型变量i 3p2j修改p2使其指向整型变量 j 由2可知3没错。 4int *constp3ip3是指向整型变量的常指针,p3初始化后不能改变他的指向但是可以修改p3指向的内存单元的值。 5*p320通过p3将变量i的值修改为2由(4)可知5没错。 6*p230通过p2修改它所指向的内存单元的值由2可知6错误。 7p3j修改p3,使其指向j,由(4)可知7错误。 参考博客https://blog.csdn.net/Yin_w/article/details/132394812 题目二十答案BC 原因由链表的属性可知第二个成员是指向数据储存数据的结构体类型的结构体指针非常明显BC均符合。 题目二十一答案ACD 原因for循环实现将每个字符串的首地址赋给指针数组中每一个元素。strp为指针数组首地址,不是字符串的引用。str[k]为第k个字符串的地址,表示第k个字符串的引用。strp[k]表示指针数组的第k个元素,为第k个字符串的地址,也是这个字符串的引用。*strp取指针数组第一个元素,即为第一个字符数组的地址,也即为第一个字符串的引用。选择A、C、D选项。 题目二十二答案B 原因64位系统下一个指针占8字节。 1char ∗ * ∗p[10]指针数组array of pointers即用于存储指针的数组也就是数组元素都是指针。如int* a[10]。 2char( ∗ * ∗p1)[10]数组指针a pointer to an array即指向数组的指针。如int (*a)[10]。 sizeof( p p p)计算的是10个char型指针的数组大小sizeof(p1)计算的是一个char型指针p1的大小所以答案为80 , 8。 题目二十三答案B 原因int fun (int *c){ … }定义了一个参数为int类型指针的函数。int ( ∗ * ∗a)(int ∗ * ∗)fun的意思是定义了一个函数指针该指针指向了fun函数所以可以通过对指针取值调用该函数且函数的参数必须是个地址只有B符合注意调用函数指针有ret (*p)(); 和ret p(); 两种形式参见博客https://blog.csdn.net/Yin_w/article/details/129962775 题目二十四答案D 原因本题考查数组和指针,在本题中c是二维数组,指针p指向二维数组c,p其实是指向c数组的第一行。因此选项A)中p1指向c数组的第二行;选项B)中,p3表示p指向c数组的第三行,因此 ∗ * ∗(p3)表示取出c数组第三行首元素的地址:选项C)和选项B)类似,表示取出数组c第二行首元素地址然后加3;选项D)中p[0]2表示数组第一行第三列元素的地址,因此 ∗ * ∗(p[0]2)是取出该元素的值。 知识模块:函数和数组 题目二十五答案D 原因动态分配在堆中其它的内存分配都在栈上进行。 题目二十六答案B 原因p是char ∗ * ∗类型每次后移一位char char ∗ * ∗pstr[0]相当于char ∗ * ∗p“stra”p先指向sp后指向tprintf输出遇到空字符停止 题目二十七答案C 由链表的属性可知第二个成员是指向数据储存数据的结构体类型的结构体指针非常明显BC均符合。 题目二十八答案C 原因%6.9s 表示显示一个长度不小于6且不大于9的字符串。若大于9, 则第9个字符以后的内容将被删除。%m.n表示场宽为m的浮点数, 其中小数位为n, 整数位为m-n-1,小数点占1位不够m位左右对齐。 题目二十九答案ABC 原因由链表的属性可知第二个成员是指向数据储存数据的结构体类型的结构体指针非常明显BC均符合。 题目三十答案D 分析· ∗ * ∗p是先取出 ∗ * ∗p的值然后让p ,( ∗ * ∗p)是先取出*p的值让这个值*p1也是先取值再让值 参考博客https://blog.csdn.net/Yin_w/article/details/132495312 总结
以上就是30道C语言指针测试题目如有错误恳请指出收集不易转载留名谢谢