指针问题.docx
- 文档编号:29625256
- 上传时间:2023-07-25
- 格式:DOCX
- 页数:14
- 大小:19.69KB
指针问题.docx
《指针问题.docx》由会员分享,可在线阅读,更多相关《指针问题.docx(14页珍藏版)》请在冰豆网上搜索。
指针问题
指针问题
1. char*constp;
charconst*p
constchar*p
上述三个有什么区别?
char*constp;//常量指针,p的值不可以修改
charconst*p;//指向常量的指针,指向的常量值不可以改
constchar*p;//和charconst*p
------------------------------------------------------
2. charstr1[]="abc";
charstr2[]="abc";
constcharstr3[]="abc";
constcharstr4[]="abc";
constchar*str5="abc";
constchar*str6="abc";
char*str7="abc";
char*str8="abc";
cout<<(str1==str2)< cout<<(str3==str4)< cout<<(str5==str6)< cout<<(str7==str8)< 打印结果是什么? 解答: 结果是: 0011 str1,str2,str3,str4是数组变量,它们有各自的内存空间;而str5,str6,str7,str8是指针,它们指向相同的常量区域 ----------------------------------------------- 3.以下代码中的两个sizeof用法有问题吗? voidUpperCase(charstr[])//将str中的小写字母转换成大写字母 { for(size_ti=0;i if('a'<=str[i]&&str[i]<='z') str[i]-=('a'-'A'); } charstr[]="aBcDe"; cout<<"str字符长度为: "< UpperCase(str); cout< 答: 函数内的sizeof有问题。 根据语法,sizeof如用于数组,只能测出静态数组的大小,无法检测动态分配的或外部数组大小。 函数外的str是一个静态定义的数组,因此其大小为6, 函数内的str实际只是一个指向字符串的指针,没有任何额外的与数组相关的信息,因此sizeof作用于上只将其当指针看,一个指针为4个字节,因此返回4。 ------------------------------------------------- 4. main() { inta[5]={1,2,3,4,5}; int*ptr=(int*)(&a+1); printf("%d,%d",*(a+1),*(ptr-1)); } 输出结果是什么? 答案: 输出: 2,5 *(a+1)就是a[1],*(ptr-1)就是a[4],执行结果是2,5 &a+1不是首地址+1,系统会认为加一个a数组的偏移,是偏移了一个数组的大小(本例是5个int) int*ptr=(int*)(&a+1); 则ptr实际是&(a[5]),也就是a+5 原因如下: &a是数组指针,其类型为int(*)[5]; 而指针加1要根据指针类型加上一定的值,不同类型的指针+1之后增加的大小不同。 a是长度为5的int数组指针,所以要加5*sizeof(int) 所以ptr实际是a[5] 但是prt与(&a+1)类型是不一样的(这点很重要) 所以prt-1只会减去sizeof(int*) a,&a的地址是一样的,但意思不一样 a是数组首地址,也就是a[0]的地址,&a是对象(数组)首地址, a+1是数组下一元素的地址,即a[1],&a+1是下一个对象的地址,即a[5]. -------------------------------------------- 5. 请问以下代码有什么问题: int main() { chara; char*str=&a; strcpy(str,"hello"); printf(str); return0; } 答案: 没有为str分配内存空间,将会发生异常。 问题出在将一个字符串复制进一个字符变量指针所指地址。 虽然可以正确输出结果,但因为越界进行内在读写而导致程序崩溃。 --------------------------------------------- 6.char*s="AAA"; printf("%s",s); s[0]='B'; printf("%s",s); 有什么错? 答案: "AAA"是字符串常量。 s是指针,指向这个字符串常量,所以声明s的时候就有问题。 cosntchar*s="AAA"; 然后又因为是常量,所以对是s[0]的赋值操作是不合法的。 --------------------------------------------- 7.int(*s[10])(int)表示的是什么? 答案: int(*s[10])(int)函数指针数组,每个指针指向一个intfunc(intparam)的函数。 --------------------------------------------- 8. 有以下表达式: inta=248;b=4; intconstc=21; constint*d=&a; int*conste=&b; intconst*fconst=&a; 请问下列表达式哪些会被编译器禁止? 为什么? *c=32;d=&b;*d=43;e=34;e=&a;f=0x321f; 答案: *c这是个什么东东,禁止 *d说了是const,禁止 e=&a说了是const禁止 const*fconst=&a;禁止 ------------------------------------------ 9. #include #include voidgetmemory(char*p) { p=(char*)malloc(100); strcpy(p,"helloworld"); } intmain() { char*str=NULL; getmemory(str); printf("%s/n",str); free(str); return0; } 分析一下这段代码 答案: 程序崩溃,getmemory中的malloc不能返回动态内存,free()对str操作很危险 ----------------------------------------- 10. charszstr[10]; strcpy(szstr,"0123456789"); 产生什么结果? 为什么? 答案: 长度不一样,会造成非法的OS ------------------------------------------ 11.要对绝对地址0x100000赋值,我们可以用(unsignedint*)0x100000=1234; 那么要是想让程序跳转到绝对地址是0x100000去执行,应该怎么做? 答案: *((void(*)())0x100000)(); 首先要将0x100000强制转换成函数指针,即: (void(*)())0x100000 然后再调用它: *((void(*)())0x100000)(); 用typedef可以看得更直观些: typedefvoid(*)()voidFuncPtr; *((voidFuncPtr)0x100000)(); ------------------------------------------ 12.分析下面的程序: voidGetMemory(char**p,intnum) { *p=(char*)malloc(num); } intmain() { char*str=NULL; GetMemory(&str,100); strcpy(str,"hello"); free(str); if(str! =NULL) { strcpy(str,"world"); } printf("\nstris%s",str);软件开发网 getchar(); } 问输出结果是什么? 答案: 输出strisworld。 free只是释放的str指向的内存空间,它本身的值还是存在的.所以free之后,有一个好的习惯就是将str=NULL. 此时str指向空间的内存已被回收,如果输出语句之前还存在分配空间的操作的话,这段存储空间是可能被重新分配给其他变量的, 尽管这段程序确实是存在大大的问题(上面各位已经说得很清楚了),但是通常会打印出world来。 这是因为,进程中的内存管理一般不是由操作系统完成的,而是由库函数自己完成的。 当你malloc一块内存的时候,管理库向操作系统申请一块空间(可能会比你申请的大一些),然后在这块空间中记录一些管理信息(一般是在你申请的内存前面一点),并将可用内存的地址返回。 但是释放内存的时候,管理库通常都不会将内存还给操作系统,因此你是可以继续访问这块地址的。 ------------------------------------------- 13.chara[10]; strlen(a)为什么等于15? #include"stdio.h" #include"string.h" voidmain() { charaa[10]; printf("%d",strlen(aa)); } 答案: sizeof()和初不初始化,没有关系; strlen()和初始化有关。 -------------------------------------------- 14.char(*str)[20];/*str是一个数组指针,即指向数组的指针.*/ char*str[20];/*str是一个指针数组,其元素为指针型数据.*/ --------------------------------------------- 15. #include #include #include #include #include #include typedefstruct AA { intb1: 5; intb2: 2; }AA; voidmain() { AAaa; charcc[100]; strcpy(cc,"0123456789abcdefghijklmnopqrstuvwxyz"); memcpy(&aa,cc,sizeof(AA)); cout< cout< } 输出结果是多少? 答案: -16和1 首先sizeof(AA)的大小为4,b1和b2分别占5bit和2bit.经过strcpy和memcpy后,aa的4个字节所存放的值是: 0,1,2,3的ASC码,即00110000,00110001,00110010,00110011所以,最后一步: 显示的是这4个字节的前5位,和之后的2位分别为: 10000,和01,因为int是有正负之分 ----------------------------------------------- 第一题: main() { char*p,*q; charstr[]="Hello,World\n"; q=p=str; p++; printf(q); printf(p); } 运行结果是什么? ____________ 第二题: voidfun(char*str1,char*str2) { staticcharbuffer[21]; strncpy(buffer,str1,10); strncat(buffer,str2,10); *str1=*str2; str1=buffer; } main() { char*str1="ABC\n"; char*str2="BCD\n"; fun(str1,str2); printf(str1); printf(str2); } 程序运行结果是__________________ 第三题: main() { shortar[11]={1,2,3,4,5,6,7,8,9,0,11}; short*par=&ar[1]; inti; for(i=0;i<10;i++) { printf("%-5hd%-5hd%-5hd",ar[i],par[i],*(ar+i)); } } 程序运行结果是__________________ 第四题: main() { short*p,*q; shortar[10]={0}; p=q=ar; p++; printf("%5d",p-q); printf("%5d",(char*)p-(char*)q); printf("%5d",sizeof(ar)/sizeof(*ar)); } 假设sizeof(short)==2 程序运行结果是__________________ 第五题: intsub(inta,intb) { returna-b; } main() { typedefint(*SUB)(int,int); SUBpsub=sub; /*psub++;*/ printf("%d",psub(10,(10,5))); } 程序运行结果是__________________,如果将中间注释掉的语句加上,编译为什么会报错? 第六题: main() { char*pstrar[3]; inti; for(i=1;i<3;i++) { pstrar[i]=" "; } strcpy(pstrar[1],"你好"); /*strcpy(pstrar[0],"世界");*/ printf(pstrar[2]); } 假设编译器设置字符串常量为可读写,则程序结果是_____________ 为什么说注释掉的程序语句是不正确的? 第七题: main() { char*p1,*p2; { char*pchar; charcharar[]="你好,世界"; pchar="Hello,World! "; p1=pchar; p2=charar; } printf(p1); printf(p2); } 说出此程序的错误之处? 第八题: main() { inti; char**p; intmsg[16]={0x40,0x41,-1,0x00,0x01,-1,0x12,-1,0x20,0x27,0x41,0x35,-1,0x51,0x12,0x04}; char*strar[]={"bejing","shanghai","guangzhou","guangdong","Tokyo","American"}; char*(*pstrar)[6]; pstrar=&strar; p=strar; for(i=0; i<16;i++) { if(msg[i]==-1) { putchar(''); continue; } elseif(msg[i]&0xF0==0x40) { putchar(p[msg[i]>>4][msg[i]&0x0F]); continue; } elseif(msg[i]&0xF0==0x30) { putchar(*(strar[msg[i]>>4]+(msg[i]&0x0F))); continue; } else { putchar(*((*pstrar)[msg[i]>>4]+(msg[i]&0x0F))); } } } 此题有故弄玄虚之处,但如理解指针,不难解出. 请问此题的运行结果是____________________ 第九题: main() { typedefcharCA3[2][2][2]; typedefCA3 *PCA3; typedefcharCA2[2][2]; typedefCA2*PCA2[2]; CA3ca3={'A','\0','B','\0','C','\0','D','\0'}; PCA3pca3=&ca3; PCA2pca2={ca3,ca3+1}; inti=0,j=0; for(i=0;i<2;i++) { printf("\n"); printf("%s\n",(char*)pca3[0][i]); printf("%s\n",(*(pca2+i))[0][1]); for(j=0;j<2;j++) { putchar(*(*(ca3+i)+j)[0]); putchar(''); } } } 求输出的结果是: _____________________ 第十题: /*C++题*/ #include classDisplay { public: virtualintShowIt(intnum){printf("%d\n",num);return0;} intShowIt(doublenum){printf("%lf\n",num);return0;} }; classDisplayEx: publicDisplay { public: intShowIt(intnum){printf("ItisInteger,valueis%d\n",num);return0;} intShowIt(constchar*str){printf("%s\n",str);return0;} }; intmain() { DisplayExdpex; Display*p_base=&dpex; p_base->ShowIt(168); p_base->ShowIt(1.68); dpex.ShowIt("Hello,World\n"); dpex.ShowIt(1.69); dpex.Display: : ShowIt(1.69); return0; } 请说出其运行结果___________________ 详细叙述c++编译器实现这一过程的方法.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 指针 问题