日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言 第六章 指针 重点 典型题

發(fā)布時間:2024/3/12 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言 第六章 指针 重点 典型题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、概念

二、重點代碼

三、重點題目

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、已有變量定義和函數(shù)調(diào)用語句:int a=25;print_value(&a);,以下函數(shù)的輸出結(jié)果是( )

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個元素的數(shù)組str,并存儲字符串china,但str[]={"china"}; 是錯誤的賦值

選項C中定義了指針變量s的同時并指向字符串china的起始地址,相當(dāng)于先定義指針變量,然后再使指針變量指向字符串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定義的數(shù)組長度不夠,因后面字符串需要6個字節(jié)

選項B中數(shù)組s存放的不是字符串,因字符串必須用'\0'表示結(jié)束

選項C中定義了指針變量s的同時并指向字符串ABCDE的起始地址,是正確的操作。

選項D中指針變量s沒有具體指向,不能使用。

5、以下程序的運行結(jié)果是( )

char *s="abcde";

s+=2;printf("%s",s);

A. cde? ? ? ? ? ? ?B.? 字符c? ? ? ? ? ? C.? 字符c的地址? ? ? ? ? ? ? D.? 不確定

答案:A127

解析:指針變量s指向字符串a(chǎn)bcde的起始位置(即字符a的位置),s+=2后s指向字符c所在的位置,執(zhí)行printf("%s",s);就是從s指向的位置開始輸出,直到遇到第一個結(jié)束符,因此應(yīng)輸出字符串cde。

6、設(shè)p1和p2是指向同一個字符串的指針變量,c為字符變量,則以下能正確執(zhí)行的賦值語句是( )。

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、設(shè)有程序段:char s[]="china";char *p;p=s;,則下列敘述正確的是( )

A.? s和p完全相同

B.? 數(shù)組s中的內(nèi)容和指針變量p中的內(nèi)容相等

C.? s數(shù)組長度和p所指向的字符串長度相等

D.? *p與s[0]相等

答案:D

解析:char s[]="china"表示定義了長度為6的字符數(shù)組s,s[0]的值是字符c,“china *p;p=s;”定義了一個指針變量p且p指向數(shù)組s的起始位置。選項A中s是數(shù)組,其占用內(nèi)存的大小為6個字節(jié),p是指針變量,存儲變量的地址,占用4個字節(jié)的內(nèi)存。

選項B中s的內(nèi)容是字符串china,而p中的內(nèi)同是字符串china的起始地址。

選項C中數(shù)組s的長度是6,指針p所指向的字符串的長度是5(注:字符串長度不包括結(jié)束符)。

選項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語言中,數(shù)組名是一個地址常量,表示該數(shù)組的起始地址。數(shù)組元素s[1]的地址可表示為&s[1]、s+1、&s[0]+1,而s++是錯誤的運算表達式(因s是常量,不能進行自增自減運算)。

9、若有定義int (*p)[4];,則標(biāo)識符p(? )

A.? 是一個指向整型變量的指針

B.? 是一個指針數(shù)組名

C.? 是一個指針,它指向一個含有4個整型元素的一維數(shù)組

D.? 定義不合法

答案:C

解析:在C語言中,語句int (*p)[4]; 表示定義了一個行指針(指向一個有4個整型元素的一維數(shù)組的指針),因此選項C正確。

10、若要對a進行自增運算,則a應(yīng)說明為( )。

A.? int a[3][2];? ? ? ? ? ? ? B.? char *a[]={"12","ab"};? ? ? ? ? ?

C.? char (*a)[3]? ? ? ? ? ? D.? int b[10],*a=b;

答案:D

解析:要對指針進行自增運算,a必須為指針變量,且要指向連續(xù)的存儲區(qū)域(自增運算才有意義)。選項A中a為數(shù)組名,是地址常量。選項B中定義了一個指針數(shù)組,a為指針數(shù)組的數(shù)組名,也就是地址常量。選項C中定義了一個行指針變量a,但沒有指向連續(xù)存儲區(qū)域。選項D中先定義了有10個元素的數(shù)組b,指針變量a指向數(shù)組b的起始位置,因此自增運算才有意義

11、已有函數(shù)max(a,b),為了讓函數(shù)指針變量p指向指針變量p指向函數(shù)max,正確的賦值方法是( )

A.? p=max? ? ? ? ? ? ? ? ? ? ? ?B.? p=max(a,b)? ? ? ? ??

C.? *p=max? ? ? ? ? ? ? ? ? ? ?D.? *p=max(a,b)

答案:A

解析:函數(shù)指針定義形式為“數(shù)據(jù)類型 (*變量名)()”,表示函數(shù)的入口地址。要使該指針指向函數(shù)的入口位置,必須將函數(shù)名賦給函數(shù)指針變量,所以A正確。

12、以下敘述正確的是( )

A.? C語言允許main函數(shù)帶行參,且形參個數(shù)和形參名均可由用戶指定

B.? C語言允許main函數(shù)帶形參,形參名只能是argc和argv

C.? 當(dāng)main函數(shù)帶有形參時,傳給形參的值只能從命令行中得到

D.? 若有說明int main(int argc,char **argv);,則argc的值必須大于1

答案:C

解析:C語言中main函數(shù)的參數(shù)是從命令行中自動獲取的,當(dāng)沒有參數(shù)時,表示程序文件本身,因此參數(shù)的個數(shù)至少為1 。

選項A中參數(shù)不應(yīng)該由用戶指定,是自動從命令行獲取的。

選項B中參數(shù)名不一定是argc和argv,只要對應(yīng)的類型正確就可以。

選項D中argc的值必須大于1的結(jié)論是不正確的,當(dāng)只有程序文件名時,argc的值為1 。

13、在C程序中,指針變量能夠賦予? ??常量?? ?值或? ??變量地址?? ?值。

解析:C語言中的指針變量可以賦值常量(其中0表示空指針,數(shù)組名表示該指針指向數(shù)組的起始位置)。也可以將一個同類型的變量地址賦給指針變量,表示該指針存儲或指向該變量的起始存儲位置。

14、在C語言中,數(shù)組名是一個不可改變的? ??指針(或地址常量)? ??,不能對它進行賦值運算。

解析:C語言中的數(shù)組名是一個地址常量,表示該數(shù)組存在內(nèi)存中的起始位置。

15、若有定義語句int a[2][3]={2,4,6,8,10,12};,則*(&a[0][0]+2*2+1)的值是? ?12? ?? ,*(a[1]+2)的值是? ? 12? ??。

解析:C語言中的二維數(shù)組是按行優(yōu)先存儲的。(&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數(shù)組元素? ? a[0]? ??,*(p[1]+1)引用的是數(shù)組a數(shù)組元素? ? a[3]? ??

解析:p是指針數(shù)組(即定義了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)(由于數(shù)組是連續(xù)存儲的),也就是a[3]。

17、以下程序的運行結(jié)果是? ? ?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);
}

解析:函數(shù)fun是將指向字符串最后的指針p與指向起始位置的指針s相減,其本質(zhì)是求字符串s的長度。主函數(shù)中字符指針a指向的字符串的長度為6 。

18、當(dāng)運行以下程序時,輸入6(回車)的程序運行結(jié)果是? ? ? ?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;
}

解析:函數(shù)fun的第一個while循環(huán)是將指針a移到字符串結(jié)束符的位置。第二個while循環(huán)是Vonda字符串的最后一個字符開始和字符變量b進行比較:若小于b,則將字符串的字符保存到后一個位置,指針向字符串前面移動一個位置:若大于或等于b,則循環(huán)結(jié)束,然后將b中存儲的字符插入到該位置。主函數(shù)中字符串為97531,c='6',因此輸出結(jié)果為976531 。

19、當(dāng)運行以下程序時,輸入“9,5(回車)”的程序運行結(jié)果是? ? ? 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、以下程序的功能是? ? ? 將數(shù)組a中的元素值首尾交換并存儲在數(shù)組中? ? ??。

#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;
?? ?}
}

解析:函數(shù)inv中,指針變量i指向數(shù)組的起始位置,指針變量j指向數(shù)組最后一個元素,p指向數(shù)組的中間位置,指針變量i和j分別向后移動和向前移動,并同時將所指向元素的值進行交換,直到i移到中間位置。

21、以下函數(shù)的功能是將一個整數(shù)字符串轉(zhuǎn)換為一個整數(shù),例如將"1234"轉(zhuǎn)換為1234,請?zhí)羁帐钩绦蛲暾?/p>

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);
}

解析:函數(shù)chnum中將指針p指向的字符串從第一個字符開始,利用*p-'0'將數(shù)字字符轉(zhuǎn)換為數(shù)字,直到字符串結(jié)束,因此第一空填*p!='\0'或*p。變量k表示對應(yīng)數(shù)字字符轉(zhuǎn)換為的數(shù)字,則第二空應(yīng)填*p-'0'。由于是高位數(shù)字先轉(zhuǎn)換,則要將轉(zhuǎn)換后的數(shù)字k不斷乘以10,根據(jù)不同的數(shù)位確定乘以10的數(shù)目,j表示當(dāng)前的數(shù)位第三空應(yīng)填j--。

22、以下函數(shù)的功能是統(tǒng)計子串substr在母串str中出現(xiàn)的次數(shù),請?zhí)羁帐钩绦蛲暾?/p>

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、以下函數(shù)的功能是用遞歸法將一個整數(shù)按逆序存放到一個字符數(shù)組中,例如483存放成了"384",請?zhí)羁帐钩绦蛲暾?/p>

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')

解析:要將數(shù)值轉(zhuǎn)換為相應(yīng)的字符串,采用數(shù)位分離(除以10取余,再整除10),再將每位數(shù)字和字符0相加得到相應(yīng)的數(shù)字字符。第一空是遞歸調(diào)用convert函數(shù),將整除10后所得的商作為函數(shù)參數(shù),同時指針向后移動一個存儲單元,因此應(yīng)填a+1 。第二空是將每位數(shù)字和字符0相加,轉(zhuǎn)為數(shù)字字符,應(yīng)填(char)(n%10)+'0'。

24、以下函數(shù)的功能是用遞歸法求數(shù)組中的最大值及其下標(biāo),請?zhí)羁帐钩绦蛲暾?/p>

void findmax(int *a,int n,int i,int *pk)
{
?? ?if(i<n)
? ? ? ? ?*pk=i??;
?? ?findmax( a, n , ++i , pk );
}

解析:函數(shù)findmax的參數(shù)中,a表示指向數(shù)組的指針變量,pk是存放最大值下標(biāo)的地址,n是數(shù)組元素的個數(shù),i是下表控制變量。若a[i]>a[*pk],則下標(biāo)改變?yōu)閕,因此第一空填*pk=i。然后遞歸調(diào)用,比較下一個元素,第二空填“a,n,++i,pk”。

25、以下函數(shù)的功能是將兩個字符串s1和s2連接起來,請?zhí)羁帐钩绦蛲暾?/p>

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已經(jīng)指到連接后的字符串的最后,要將指針移到前面,則第三空填s1=p。

26、假定輸入的字符串中只包含字母和*。請編寫函數(shù)fun,它的功能是:除了字符串前導(dǎo)的*之外,將串中其他的*全部刪除。在編寫函數(shù)時,不得不去使用C語言提供的字符串函數(shù)。例如,若字符串中的內(nèi)容為****A*BC*DEF*G******,刪除*后,字符串中的內(nèi)容則應(yīng)當(dāng)是****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';
}

解析:從左到右掃描,找到第一個不是*的字符(找到相應(yīng)的下表位置,例如j),將后面所有不是*的字符都保存到數(shù)組中,直到結(jié)束,然后寫入數(shù)組結(jié)束符'\0'。

(未完待續(xù))

總結(jié)

以上是生活随笔為你收集整理的C语言 第六章 指针 重点 典型题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。