軟考軟件設(shè)計師練習(xí)題:第五章及解答

字號:

5.1 單項選擇題
     1.設(shè)有定義“int a=3, b,*p=&a;”,則下列語句中使 b不為3的語句是( )
     ① b=* &a; ② b=* p;
     ③ b=a; ④ b=*a;
     【解】定義有 int a=3, b,*p=&a;對b賦值的表達式有*&a、*p、a 、*a。引用變量。的值有兩種方法,一是直接引用a,二是通過a的指針間接引用a。對于后者,又有多種表達方法,通過指向a的指針p,間接引用a的內(nèi)容,如*p?;蛲ㄟ^求地址運算符由變量a得到其指針&a,再由這指針表達式間接引用 a的內(nèi)容,如* &a。所以表達式*&a、*p和a都能引用變量a的值,而使b的值為3。而表達式。a是錯誤的,因為a不是指針變量,不能對它施行取內(nèi)容運算符。。所以解答是④。
     2 .設(shè)指針x指向的整型變量值為萬,則"printf("%d\n",++ *x);"的輸出是( )
     ① 23 ② 24 ③ 25 ④ 26
     【解】若指針變量x指向某個變量,例如指向變量v,并且變量v的值是25,則表達式++ *x的值是26。這是因為表達式的計算順序可加圓括號表達成(++(*x)),首先是*x,是對X所指變量V的引用,所以++ *X就是++V。++V是先讓變量V增1,并以增至后的V的值為表達式++V的結(jié)果,所以其值是 26。所以解答是④。
     3.若有說明:“ int i,j= 7,*p=&i;”,則與“ i=j(luò);”等價的語句是( )
     ①i=*p; ②*P=* &j;
     ③i==&j; ④i=* *p;
     【解】指針變量 p指向變量i時,表達式i=*p等價于 i=i;表達式*p=*&j等價于i=j(luò);而表達式i=&j企圖將整型變量的指針賦給整型變量,這是錯誤的;表達式i=* *p也是一種錯誤的表達式。p是指針,*p是p所指變量j,* *p是企圖將整型變量j當(dāng)作指針,并想通過j間接引用某個變量。所以解答是②。
     4.若有說明語句“int a[10],*p=a;”,對數(shù)組元素的正確引用是( )
     ①a[p] ②P[a]
     ③*(P+2) ④P+2
     【解】在 C語言中,約定數(shù)組名單獨出現(xiàn)在表達式中時,它表示數(shù)組首元素的指針。有int a[10] ,則a可以作為&a[0]使用。另有整型指針變量p,代碼p=a實現(xiàn)p指向數(shù)組a的首元素。則表達式*(p+2)是引用數(shù)組元素a[2]。表達式a[p]和p[a]都是不正確的,下標(biāo)必須是整型表達式,不可以是指針表達式。表達式p+2是指針表達式,它的值是&p[2]。所以只有表達式*(p+2)引用數(shù)組a的元素a[2]。所以解答是③。
     5.下面各語句中,能正確進行賦字符串操作的語句是( )
     ①char s[5] ={"ABCDE"}; ②char s[5] ={’A’,’B’,’C’,’D’,’E’};
     ③ char *s;s="ABCDE"; ④ char *s;scanf("%", s);
     【解】字符串最終存儲于字符數(shù)組中,存儲字符串的字符數(shù)組可以是程序主動引入的(定義或動態(tài)分配),也可以是字符串常量,由系統(tǒng)分配。其中字符數(shù)組用字符串初始化就是字符串存儲于由程序引入的字符數(shù)組的例子。給字符指針賦字符串則是系統(tǒng)自動分配字符率存儲空間的例子。給字符指針賦字符串并不是將一個長長的字符串存于字符指針變量中,而是將字符串常量存儲于常量區(qū),并將存儲這個字符串的首字節(jié)地址賦給指針變量,讓指針變量指向字符率常量的首字符。對于以字符串作為字符數(shù)組初值的情況,要求字符數(shù)組足夠的大,能存得下字符串常量。這里有一個特別的規(guī)定,若數(shù)組的大小少于存儲字符串有效字符的字節(jié)個數(shù),系統(tǒng)將報告錯誤;當(dāng)字符數(shù)組的大小只能存儲字符串的有效字符,而不能存儲字符率結(jié)束標(biāo)記符時,則存儲于字符數(shù)組中的內(nèi)容是字符序列,因沒有存儲字符率結(jié)束標(biāo)記符,存儲的內(nèi)容就不是字符串。如代碼char a[5]="ABCDE"。另外,給字符數(shù)組元素逐一賦字符初值,并在字符初值中沒有字符串結(jié)束標(biāo)記符,則存于字符數(shù)組中的內(nèi)容也不是字符率。如代碼 char s[5]={’A’,’B’,’C’,’D’,’E’}。特別要注意當(dāng)字符指針還未指向某個字符數(shù)組的元素時,不可以通過字符指針輸入字符串。如代碼char *s;scanf("%s",s)。若寫成char *str;scanf("%s",&str)更是錯誤的了。由于C語言規(guī)定數(shù)組不能相互賦值,所以只能將字符串常量賦給某字符指針。如代碼char *s;s="ABCDE"是正確的。實際上,字符率"ABCDE" 被存儲于常量區(qū)中,向指針變量賦的是字符指針,讓s指向其中的字符’A’。所以解答是③。
     6.若有以下定義,則不能表示a數(shù)組元素的表達式是()
     int a[10]={1,2,3,4,5,6,7,8,9,1o},*p=a;
     ①*p ② a[10] ③*a ④ a[p-a]
     【解】上述代碼定義了有10個元素的整型數(shù)組。,和定義指針變量p,并讓p指向數(shù)組元素a[0]。所以代碼*p是引用 a[0]。由于數(shù)組a只有10個元素,最后一個元素是a[9],表達式a[10]是錯誤的。數(shù)組名a可以作為a的首元素的指針,表達式*a就是a[0] ,是對數(shù)組a的首元素a[0]的引用。指針p的值是a,表達式p-a。的值是0,所以a[p-a]就是a[0]。所以解答是②。
     7.若有以下定義,則值為3的表達式是()
     int a[]= {1,2,3,4,5,6,7,8,9,10},*p=a;
     ①p+=2,*(p++) ③p+=2,* ++p
     ③p+=3,*p++ ④ p+=2,++ *p
     【解】數(shù)組a有10個元素,分別有值1至10,指針變量p指向a[0] ①逗號表達式 p+=2,*(P++),先是P+=2使P指向a[2],接著是*(P++),以當(dāng)時P所指變量a[2]取內(nèi)容3為表達式的值,同時使p指向a[3]。②返號表達式p+=2,* ++p,先是p+=2使p指向a[2],以后是* ++p,又使 p增1,讓它指向a[3],并取指針p所指變量a[3]的內(nèi)容4作為表達
    式的值。③逗號表達式 p+=3,*p++,先是p+=3使p指向a[3],以后是*p++,表達式的值是 a[3]為 4,而使p指向a[4]。④逗號表達式p+=2,++ *p,先是p+=2,使p指向a[2],以后是++ *p,因當(dāng)時的*p就是 a[2],++a[2]使a[2]增1,變成4,并以4為表達式的值。所以只有p+=2,*(p++)的值是3。所以解答是①。
     8.設(shè)有定義“char a[10]={"abcd"},*p=a;",則*(p+4)的值是( )
     ①"abCd" ②’d’
     ③’\0’ ④不能確定
     【 解】若有char a[10]="abcd",*p=a,則指針變量p指向a[0]。在表達式*(p+4)中,p+4指向a[4],*(p+4)就是a[4]。由于用字符"abcd" 給字符數(shù)組a賦初值,a[4]的值是字符串結(jié)束標(biāo)記符’\0’。所以解答是③。
     9.設(shè)有代碼"int(*ptr)[10];”,其中的ptr是( )
     ①10個指向整型變量的指針
     ②指向10個整型變量的函數(shù)指針
     ③一個指向具有10個元素的一維數(shù)組的指針
     ④具有10個指針元素的一維數(shù)組
     【解】代碼“int(*ptr)[10];”的分析過程是,因圓括號,括號內(nèi)的ptr先與字符*結(jié)合,字符*修飾標(biāo)識符ptr是一種指針;接著與后面的一對方括號結(jié)合,表示是這樣的一種指針,是指向一維數(shù)組的;再有方括號中的10,說明這種數(shù)組有10個元素。至此,ptr是指向含10個元素的
    一維數(shù)組的指針。最后,是最前面的int,表示數(shù)組元素是int類型的。所以,ptr是一個指向具有10個int型元素的一維數(shù)組的指針。所以解答是③。另外,要是①,10個指向整型變量的指針,就是一個指針數(shù)組,上述代碼應(yīng)寫成“int *ptr[10];”,即ptr是一個有10個指向整型變量的數(shù)組。要是②,返回值是指向10個整型變量的函數(shù)的指針,上述代碼應(yīng)寫成“int(*(*ptr)())[10];”,即ptr是指針,指向一種函數(shù),函數(shù)的返回值又是一種指針,指向10個元素的數(shù)組,數(shù)組的元素是整型的。下面的代碼是這樣的函數(shù)指針和函數(shù)的例子:
     # include
     int a[][10]={{1,2,3,4,5,6,7,8,9,0} ,{0,1,2,3,4,5,6,7,8,9} };
     int(*(*ptr)(int))[10];
     int(*f( int n))[10]
     {return a+n;
     }
     void main()
     { int(*p)[10],*q;
     ptr=f;/*讓ptr指向函數(shù)f*/
     P=(*ptr)(0);
     q=*p;
     printf("%d\n", *p);
     P=(*ptr)(l);
     q=*p;
     printf("%d\n", *q);
     }
     在上述代碼中,函數(shù)有一個int型的形參。要是④,其意義與①相同,上述代碼應(yīng)寫成“int* ptr[10];”,即 ptr是一個有10個元素的數(shù)組,數(shù)組元素是指向整型變量的指針。