Title

cpp-week_one-错题整理

cpp-week_one-错题整理

2-14.以下哪个定义中的p不是指针,请选择恰当的选项:

A.char **p;

B.char (*p)[10];

C.char *p[6];

D.给出的三项中,p都是指针

**p

  • 先将*p看成是一个整体(内容是指向p的指针),设为t,则*t是指向t的指针,所以**p的意思是指向(指向p的指针)的指针

char (*p)[10]

  • ()的优先级最高,意味着p和*先形成了指针,而[10](以10个元素)是指针p所指向的内容,char表明了[10]元素的数据类型。
  • 数组指针:指向数组的指针

char *p[6]

  • []的优先级高于*,故p会与[10]先结合形成数组,而char * 规定了数组p的每个元素的数据类型为字符型的指针
  • 指针数组:存放指针的数组,数组里每一元素才是指针,这种数组是指针的集合

2-16.若有说明: char *language[]={“FORTRAN”,“BASIC”,“PASCAL”,“JAVA”,“C”}; 则以下不正确的叙述是 ( )。

A.language+2表示字符串"PASCAL"的首地址

B.*language[2]的值是字符P

C.language是一个字符型指针数组,它包含5个元素,每个元素是一个指向字符串变量的指针

D.language是一个字符型指针数组,它包含5个元素,其初值分别j : "FORTRAN","BASIC","PASCAL","JAVA","C"

B.*language[2]的值是字符P

  • language先和[2]结合找到PASCAL,在对PASCAL进行*操作,得到PASCAL的首字母。

  • #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
    	 char *language[]={"FORTRAN","BASIC","PASCAL","JAVA","C"}; 
    	 cout<<language<<"  "<<*language<<endl;
    	 cout<<language+1<<"  "<<*(language+1)<<endl;
    	 cout<<language+2<<"  "<<*(language+2)<<endl;
    	 cout<<language+3<<"  "<<*(language+3)<<endl;
    	 cout<<language+4<<"  "<<*(language+4)<<endl;
    	 
    	 cout<<language[2]<<endl;
    	 cout<<*language[2]<<endl;
    	 cout<<*(language[2]+1)<<endl;
        return 0;
    }
    

D.选DOG?

2-54.设有下面的程序段:char s[]="china";char *p=s;则下列叙述正确的是____。

A.数组s中的内容和指针变量p中的内容相等

B.s和p完全相同

C.s数组长度和p所指向的字符串长度相等

D.*p与s[0]相等

传送门

答:答案:D
A:s是字符数组,p是指向字符串的指针
B:显然数组s中的内容和指针变量p中的内容不相等,应该换一种说法“数组s中的内容和指针变量p所指向的字符串的内容相等”

  • 指针变量p中的内容,存放的是地址?

C:s数组的长度为6(包含结束符’\0’),p所指向的字符串长度为5
D:*p=‘c’,s[0]=‘c’
追问
p所指向的字符串长度为啥是5呢?它不识别’\0’吗?
追答
'\0’不计入字符串总长度

posted @ 2021-05-17 00:43  BeautifulWater  阅读(1094)  评论(0编辑  收藏  举报