C语言 第六章 指针 重点 典型题
一、概念
二、重點代碼
三、重點題目
1、若有說明:int *p,m=5,n;,以下程序段正確的是( )
A.? p=&n;
? ? ? scanf("%d",&p);
B.? p=&n;
? ? ? scanf("%d",*p);
C.? scanf("%d",&n);
? ? ? *p=n;
D.? p=&n;
? ? ? *p=m;
答案:D
解析:
?
2、已有變量定義和函數調用語句:int a=25;print_value(&a);,以下函數的輸出結果是( )
void print_value(int *x)
{? ? printf("%d\n",++*x);? }
A.? 23? ? ? ? ? ? ? B.? 24? ? ? ? ? ? ? C.? 25? ? ? ? ? ? ?D.? 26
答案:D
解析:
?
3、下面判斷正確的是( )
A.? char *p="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";
答案:C
解析:選項A中定義一個指針變量a,使a指向字符串china的起始地址,而在賦值語句中的*a表示a所指向位置的值,因此*a="china"是錯誤的。
選項B定義了有10個元素的數組str,并存儲字符串china,但str[]={"china"}; 是錯誤的賦值。
選項C中定義了指針變量s的同時并指向字符串china的起始地址,相當于先定義指針變量,然后再使指針變量指向字符串china的起始地址,因此該選項是正確的。
選項D中char c[4]=d[4]="abc"; 的定義是錯誤的。
4、下面能正確進行字符串操作的是( )
A.? char s[5]={"ABCDE"};
B.? char s[5]={'A','B','C','D','E'};
C.? char *s; s="ABCDE";
D.? char *s; scanf("%s",s);
答案:C
解析:選項A定義的數組長度不夠,因后面字符串需要6個字節。
選項B中數組s存放的不是字符串,因字符串必須用'\0'表示結束。
選項C中定義了指針變量s的同時并指向字符串ABCDE的起始地址,是正確的操作。
選項D中指針變量s沒有具體指向,不能使用。
5、以下程序的運行結果是( )
char *s="abcde";
s+=2;printf("%s",s);
A. cde? ? ? ? ? ? ?B.? 字符c? ? ? ? ? ? C.? 字符c的地址? ? ? ? ? ? ? D.? 不確定
答案:A127
解析:指針變量s指向字符串abcde的起始位置(即字符a的位置),s+=2后s指向字符c所在的位置,執行printf("%s",s);就是從s指向的位置開始輸出,直到遇到第一個結束符,因此應輸出字符串cde。
6、設p1和p2是指向同一個字符串的指針變量,c為字符變量,則以下能正確執行的賦值語句是( )。
A.? c=*p1+*p2? ? ? ? ? B.? p2=c? ? ? ? ? C.? p1=p2? ? ? ? ? ?D.? c=*p1*(*p2)
答案:C
解析:因指針變量p1和p2都指向同一字符串,*p1和*p2的值是某個字符,由于字符串的ASCII碼值為0~127,因此*p1+*p2或*p1*(*p2)的值可能超過127,這樣得到的字符串變量c的值可能沒有意義,因此選項A和D不能保證正確。
選項B中是將字符串變量c的值賦給指針變量p2,類型不正確。
選項C將兩個同級的有指向的指針賦值,是正確的。
7、設有程序段:char s[]="china";char *p;p=s;,則下列敘述正確的是( )
A.? s和p完全相同
B.? 數組s中的內容和指針變量p中的內容相等
C.? s數組長度和p所指向的字符串長度相等
D.? *p與s[0]相等
答案:D
解析:char s[]="china"表示定義了長度為6的字符數組s,s[0]的值是字符c,“china *p;p=s;”定義了一個指針變量p且p指向數組s的起始位置。選項A中s是數組,其占用內存的大小為6個字節,p是指針變量,存儲變量的地址,占用4個字節的內存。
選項B中s的內容是字符串china,而p中的內同是字符串china的起始地址。
選項C中數組s的長度是6,指針p所指向的字符串的長度是5(注:字符串長度不包括結束符)。
選項D中*p的值是字符c,s[0]的值也是字符c,因此選項D正確。
8、若已定義char s[10];,則在以下表達式中不表示s[1]的地址的是( )。
A.? s+1? ? ? ? ? ? ? ? ? B.? ++s? ? ? ? ? ? ?C.? &s[0]+1? ? ? ? ? ? D.? &s[1]
答案:B
解析:C語言中,數組名是一個地址常量,表示該數組的起始地址。數組元素s[1]的地址可表示為&s[1]、s+1、&s[0]+1,而s++是錯誤的運算表達式(因s是常量,不能進行自增自減運算)。
9、若有定義int (*p)[4];,則標識符p(? )
A.? 是一個指向整型變量的指針
B.? 是一個指針數組名
C.? 是一個指針,它指向一個含有4個整型元素的一維數組
D.? 定義不合法
答案:C
解析:在C語言中,語句int (*p)[4]; 表示定義了一個行指針(指向一個有4個整型元素的一維數組的指針),因此選項C正確。
10、若要對a進行自增運算,則a應說明為( )。
A.? int a[3][2];? ? ? ? ? ? ? B.? char *a[]={"12","ab"};? ? ? ? ? ?
C.? char (*a)[3]? ? ? ? ? ? D.? int b[10],*a=b;
答案:D
解析:要對指針進行自增運算,a必須為指針變量,且要指向連續的存儲區域(自增運算才有意義)。選項A中a為數組名,是地址常量。選項B中定義了一個指針數組,a為指針數組的數組名,也就是地址常量。選項C中定義了一個行指針變量a,但沒有指向連續存儲區域。選項D中先定義了有10個元素的數組b,指針變量a指向數組b的起始位置,因此自增運算才有意義。
11、已有函數max(a,b),為了讓函數指針變量p指向指針變量p指向函數max,正確的賦值方法是( )
A.? p=max? ? ? ? ? ? ? ? ? ? ? ?B.? p=max(a,b)? ? ? ? ??
C.? *p=max? ? ? ? ? ? ? ? ? ? ?D.? *p=max(a,b)
答案:A
解析:函數指針定義形式為“數據類型 (*變量名)()”,表示函數的入口地址。要使該指針指向函數的入口位置,必須將函數名賦給函數指針變量,所以A正確。
12、以下敘述正確的是( )
A.? C語言允許main函數帶行參,且形參個數和形參名均可由用戶指定
B.? C語言允許main函數帶形參,形參名只能是argc和argv
C.? 當main函數帶有形參時,傳給形參的值只能從命令行中得到
D.? 若有說明int main(int argc,char **argv);,則argc的值必須大于1
答案:C
解析:C語言中main函數的參數是從命令行中自動獲取的,當沒有參數時,表示程序文件本身,因此參數的個數至少為1 。
選項A中參數不應該由用戶指定,是自動從命令行獲取的。
選項B中參數名不一定是argc和argv,只要對應的類型正確就可以。
選項D中argc的值必須大于1的結論是不正確的,當只有程序文件名時,argc的值為1 。
13、在C程序中,指針變量能夠賦予? ??常量?? ?值或? ??變量地址?? ?值。
解析:C語言中的指針變量可以賦值常量(其中0表示空指針,數組名表示該指針指向數組的起始位置)。也可以將一個同類型的變量地址賦給指針變量,表示該指針存儲或指向該變量的起始存儲位置。
14、在C語言中,數組名是一個不可改變的? ??指針(或地址常量)? ??,不能對它進行賦值運算。
解析:C語言中的數組名是一個地址常量,表示該數組存在內存中的起始位置。
15、若有定義語句int a[2][3]={2,4,6,8,10,12};,則*(&a[0][0]+2*2+1)的值是? ?12? ?? ,*(a[1]+2)的值是? ? 12? ??。
解析:C語言中的二維數組是按行優先存儲的。(&a[0][0]+2*2+1)就是從a[0][0]的存儲位置向移動5個存儲位置,正好是a[1][2]的位置,因此*(&a[0][0]+2*2+1)就是a[1][2]。*(a[1]+2)展開可表示為*(*(a+1)+2),正好也是a[1][2]。
16、若有程序段
int *p[3],a[6],i;
for(i=0;i<3;i++)
? ? ?p[i]=&a[2*i];
則*p[0]引用的是a數組元素? ? a[0]? ??,*(p[1]+1)引用的是數組a數組元素? ? a[3]? ??。
解析:p是指針數組(即定義了3個指針p[0]、p[1]、p[2]),p[0]=&a[0],p[1]=&a[2],p[2]=&a[4],因此*p[0]就是a[0],*(p[1]+1)就是*(&a[2]+1)(由于數組是連續存儲的),也就是a[3]。
17、以下程序的運行結果是? ? ?6? ? ?。
#include <stdio.h>
int fun(char *)
int main()
{
?? ?char *a="abcdef";
?? ?printf("%d\n",fun(a));
?? ?return 0;
}
int fun(char *s)
{
?? ?char *p=s;
?? ?while (*p)
?? ??? ?p++;
?? ?return (p-s);
}
解析:函數fun是將指向字符串最后的指針p與指向起始位置的指針s相減,其本質是求字符串s的長度。主函數中字符指針a指向的字符串的長度為6 。
18、當運行以下程序時,輸入6(回車)的程序運行結果是? ? ? ?976531? ? ? ??。
#include<stdio.h>
void fun(char * ,char);
int main()
{
?? ?char s[]="97531",c;
?? ?c=getchar();
?? ?fun(s,c);
?? ?puts(s);
?? ?return 0;
}
void fun(char *a,char b)
{
?? ?while (*(a++)!='\0');
?? ?while (*(a-1)<b)
?? ??? ?*(a--)=*(a-1);
?? ?*(a--)=b;
}
解析:函數fun的第一個while循環是將指針a移到字符串結束符的位置。第二個while循環是Vonda字符串的最后一個字符開始和字符變量b進行比較:若小于b,則將字符串的字符保存到后一個位置,指針向字符串前面移動一個位置:若大于或等于b,則循環結束,然后將b中存儲的字符插入到該位置。主函數中字符串為97531,c='6',因此輸出結果為976531 。
19、當運行以下程序時,輸入“9,5(回車)”的程序運行結果是? ? ? 5,9? ? ? ??。
#include<stdio.h>
void swap(int *p1,int *p2);
int main()
{
?? ?int a,b;
?? ?int *pa,*pb;
?? ?scanf("%d,%d",&a,&b);
?? ?pa=&a;
?? ?pb=&b;
?? ?swap(pa,pb);
?? ?printf("\n%d,%d",&a,&b);
?? ?return 0;
}
void swap(int *p1,int *p2)
{
?? ?int p;
?? ?p=*p1;
?? ?*p1=*p2;
?? ?*p2=p;
}
20、以下程序的功能是? ? ? 將數組a中的元素值首尾交換并存儲在數組中? ? ??。
#include<stdio.h>
void inv(int *,int);
int main()
{
?? ?int i,a[10]={3,7,9,11,0,6,7,5,4,2};
?? ?inv(a,10);
?? ?for(i=0;i<10;i++)
?? ??? ?printf("%d",a[i]);
?? ?printf("\n");
}
void inv(int *x,int n)
{
?? ?int t,*p,*i,*j,m=(n-1)/2;
?? ?i=x;
?? ?j=x+n-1;
?? ?p=x+m;
?? ?for(;i<=p;i++,j--)
?? ?{
?? ??? ?t=*i;
?? ??? ?*i=*j;
?? ??? ?*j=t;
?? ?}
}
解析:函數inv中,指針變量i指向數組的起始位置,指針變量j指向數組最后一個元素,p指向數組的中間位置,指針變量i和j分別向后移動和向前移動,并同時將所指向元素的值進行交換,直到i移到中間位置。
21、以下函數的功能是將一個整數字符串轉換為一個整數,例如將"1234"轉換為1234,請填空使程序完整。
int chnum(char *p)
{
?? ?int num=0,k,len,j;
?? ?len=strlen(p);
?? ?for(;? ?*p!='\0'? ?;p++)
?? ?{
?? ??? ?k=? ?*p-'0'? ?;
?? ??? ?j=(--len);
?? ??? ?while(? ? j--? ?)
?? ??? ??? ?k=k*10;
?? ??? ?num=num+k;
?? ?}
?? ?return (num);
}
解析:函數chnum中將指針p指向的字符串從第一個字符開始,利用*p-'0'將數字字符轉換為數字,直到字符串結束,因此第一空填*p!='\0'或*p。變量k表示對應數字字符轉換為的數字,則第二空應填*p-'0'。由于是高位數字先轉換,則要將轉換后的數字k不斷乘以10,根據不同的數位確定乘以10的數目,j表示當前的數位第三空應填j--。
22、以下函數的功能是統計子串substr在母串str中出現的次數,請填空使程序完整。
int count(char *str,char *substr)?
{
?? ?int num,i,j,k;
?? ?for(i=0;? ? str[i]!=0? ??; i++)
?? ??? ?for(? ? j=i? ??,k=0; substr[k]==str[j]; k++,j++)
?? ??? ??? ?if(substr[k+1]=='\0')?
?? ??? ??? ?{
?? ??? ??? ??? ?num++;
?? ??? ??? ??? ?break;
?? ??? ??? ?}
?? ?return (num);
}
答案:? ? i<strlen(str)(或str[i]或str[i]!=0)??,? ? ?j=i? ? ?,? ? ?k+1? ? 。
解析:
23、以下函數的功能是用遞歸法將一個整數按逆序存放到一個字符數組中,例如483存放成了"384",請填空使程序完整。
void convert(char *a,int n)
{
?? ?int i;
?? ?if((i=n/10)!=0)
?? ??? ?convert(? a+1??,i);
?? ?*a=? ? (char)(n%10)+'0'? ??;
}
答案: a+1 ,??(char)(n%10)+'0'? (或(n%10)+'0')
解析:要將數值轉換為相應的字符串,采用數位分離(除以10取余,再整除10),再將每位數字和字符0相加得到相應的數字字符。第一空是遞歸調用convert函數,將整除10后所得的商作為函數參數,同時指針向后移動一個存儲單元,因此應填a+1 。第二空是將每位數字和字符0相加,轉為數字字符,應填(char)(n%10)+'0'。
24、以下函數的功能是用遞歸法求數組中的最大值及其下標,請填空使程序完整。
void findmax(int *a,int n,int i,int *pk)
{
?? ?if(i<n)
? ? ? ? ?*pk=i??;
?? ?findmax( a, n , ++i , pk );
}
解析:函數findmax的參數中,a表示指向數組的指針變量,pk是存放最大值下標的地址,n是數組元素的個數,i是下表控制變量。若a[i]>a[*pk],則下標改變為i,因此第一空填*pk=i。然后遞歸調用,比較下一個元素,第二空填“a,n,++i,pk”。
25、以下函數的功能是將兩個字符串s1和s2連接起來,請填空使程序完整。
void conj(char *s1,char *s2)
{
?? ?char *p=s1;
?? ?while (*s1)
? ? ? ??s1++ ;
?? ?while (*s2)
?? ?{
?? ??? ?*s1= *s2 ;
?? ??? ?s1++,s2++;
?? ?}
?? ?*s1='\0';
?? ?s1=p ;
}
解析:將指針變量s2指向的字符串連接到s1所指向的字符串后面,首先要將指針s1移到字符串最后,然后將s2所指字符串的字符賦值給s1所指的位置,同時指針變量s1、s2向后移動,因此第一空填s1++,第二空填*s。由于s1已經指到連接后的字符串的最后,要將指針移到前面,則第三空填s1=p。
26、假定輸入的字符串中只包含字母和*。請編寫函數fun,它的功能是:除了字符串前導的*之外,將串中其他的*全部刪除。在編寫函數時,不得不去使用C語言提供的字符串函數。例如,若字符串中的內容為****A*BC*DEF*G******,刪除*后,字符串中的內容則應當是****ABCDEFG。
法一:普通寫法
void fun(char x[])
{
?? ?int i,j=0;
?? ?for(i=0;i<strlen(x)&&x[i]=='*';i++)
?? ?{
?? ??? ?x[j++]=x[i];
?? ?}
?? ?while(x[i])
?? ?{
?? ??? ?if(x[i]!='x')
?? ??? ??? ?x[j++]=x[i];
?? ??? ?i++;
?? ?}
?? ?x[j]='\0';
}
法二:指針
void fun(char *x)
{
?? ?int i,j=0;
?? ?char *p;
?? ?p=x;
?? ?while(*p=='*')
?? ??? ?*x++=*p++;
?? ?while(*p)
?? ?{
?? ??? ?if(*p!='*')
?? ??? ??? ?*x++=*p;
?? ??? ?p++;
?? ?}
?? ?*x='\0';
}
解析:從左到右掃描,找到第一個不是*的字符(找到相應的下表位置,例如j),將后面所有不是*的字符都保存到數組中,直到結束,然后寫入數組結束符'\0'。
(未完待續)
總結
以上是生活随笔為你收集整理的C语言 第六章 指针 重点 典型题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: unity编辑器报错Microsoft
- 下一篇: 蜂鸣器制作“ 孤勇者 ”音乐