数组指针练习

一.改错

下面是一个有错误的程序,功能是输入5个数存放到一维数组中并输出。请编译程序,并在注释处修改程序中的错误,使它能得出正确的结果。

注意:不得增行或删行,也不得更改程序的结构。程序如下:

#include <stdio.h>
void main()
{    
    int i,n=5,a[n] ;            /*ERROR1*/
    for(i=0;i<5; i++)
        scanf ("%d",a[i]);     /*ERROR2*/                
    for (i=0;i<=5;i++)           /*ERROR3*/                
        printf("%d",a);        /*ERROR4*/    
}    

正确答案为:

#include <stdio.h>
void main()
{    
    int i,n=5,a[5] ;            
    for(i=0;i<5; i++)
        scanf ("%d",&a[i]);                     
    for (i=0;i<5;i++)                           
        printf("%d",a[i]);            
}    

二.分析并运行程序,说明程序的功能。

#include <stdio.h>
void main()
{    
    int a[6]={12,4,17,25,27,16},b[6]={27, 13,4, 25,23,16},i,j;
    for(i=0;i<6;i++)
    {
         for(j=0;j<6;j++)    
         if (a[i]==b[j])        break;            //第一个if跟在for后面
        if(j<6)    printf("%d ",a[i]);            //第二个if和前面的for,if独立。
    }
    printf("\n");  
}

输出结果为:

4 25 27 16

分析:输出a和b相同的数

三.完善程序。

以下程序的功能是将十进制正整数m转换成r(二~十六)进制数并输出。请完善程序。

#include <stdio.h>
void main()
{    int m,r,i=0,x;
    char s[80];
    printf ("请输入十进制数和要转换的进制: \n");
    scanf ("%d%d",_____ );                
    while(m!=0)
    {    
        x=m%r;
         if (x>9) s[i++]=x-10+'A';              /*若转换成十六进制,10~15的数字应转换为A~F*/
         else     s[i++]=_________________ ;  /*转化成字符存储*/
        m=m/r;   
    }
    printf ("转换后的结果为:");
    _________ ;                    
    while(i>=0)                               /*逆序输出s数组中存放的值*/
        printf ("%c",___________________ );
    printf ("\n") ;       
    }

正确答案为:

#include <stdio.h>
void main()
{    int m,r,i=0,x;
    char s[80];
    printf ("请输入十进制数和要转换的进制: \n");
    scanf ("%d%d",&m,&r);                
    while(m!=0)
    {    
        x=m%r;  
        if (x>9) s[i++]=x-10+'A';                    /*若转换成十六进制,10~15的数字应转换为A~F*/
        else     s[i++]=x-0+'0';                    /*转化成字符存储*/
        m=m/r;   
    }
    printf ("转换后的结果为:");
    i--;                    
    while(i>=0)                                       /*逆序输出s数组中存放的值*/
        printf ("%c",s[i--]);
    printf ("\n") ;       
}

分析:要熟悉进制转换,再分情况分析。

四.改错

下面是一个有错误的程序,功能是输入一个字符串,在指定的位置插入字符“s”。(插入的位置从键盘输入,且假设位置(此处即是下标)在字符串的长度以内)。请编译程序,并在注释处修改程序中的错误,使它能得出正确的结果。

注意:不得增行或删行,也不得更改程序的结构!

程序如下:

#include <stdio.h>
#include <string.h>
void main()
{    
    char a[80] ;
    int i, j,k;
    scanf ("%s",a[]) ;     /*ERROR1*/
    scanf ("%d",&i) ;
    k=strlen(a) ;
    j=k;
    while(j>=i)
    {    
         a[j+1]=a[j];
        j++;            /*ERROR2*/   
    }
     a[j]='s';             /*ERROR3*/
     printf ("%s",a);            
}

正确答案为:

#include <stdio.h>
#include <string.h>
void main()
{    char a[10] ;
    int i, j,k;
    scanf ("%s",a);
    scanf ("%d",&i);
    k=strlen(a) ;
    j=k;
    while(j>=i)
    {    a[j+1]=a[j];     //将a[i]及以后的字符右移一位
        j--;
    }
    a[i]='s';            //将s赋值给a[i],原来的a[i]已经左移     
    printf ("%s",a);            
}

分析:

1.%s输入字符时不用打[]

2.见答案注释

3.见答案注释

五.改错

下面是一个有错误的程序,功能是在屏幕上输出以下图形(字符之间没有空格)

54321
43215
32154
21543
15432

请编译程序,并在注释处修改程序中的错误,使它能得出正确的结果。

注意:不得增行或删行,也不得更改程序的结构!

程序如下:

#include <stdio.h>
#include <string.h>
void main() 
{    
    char a[6]="54321", temp;
    int i,k;
    for(i=1;i<=5;i++)
    {    
        printf("%c\n",a);        /*ERROR1*/            
        temp=a[0];
        for(k=0;k<4;k++)
            a[k+1]=a[k];        /*ERROR2*/
        a[4]=a[0];                /*ERROR3*/                        
    }
}

正确答案:

#include <stdio.h>
#include <string.h>
void main() 
{    char a[6]="54321", temp;
    int i,k;
    for(i=1;i<=5;i++)
    {    
        printf("%s\n",a);        //用%s输出字符串        
        temp=a[0];
        for(k=0;k<4;k++)
            a[k]=a[k+1];        //将a[]左移一位
        a[4]=temp;                //将最开始的a[0]赋给a[4]            
    }
}

六.完善程序

以下程序判断输入的字符串是否“回文”(即顺读和倒读都一样,例如:ABCBA,假设字符串前后没有空格)。请填空。

#include <stdio.h>
#include <string.h>
void main()
{    
    char s[100];
    int left, right, middle, lenth;
    printf("Please input a string:");
    gets(s) ;
    lenth=strlen(s);
    left=______________ ;        
    middle=lenth/2;
    while (left<=middle)
    {    
        right=lenth-1-left;
        if(s[left] ___ s[right])left++;
        else    break;
    }
    if (left ___ middle)    printf ("No\n") ;
    else    printf ("Yes\n");   
}

正确答案:

#include <stdio.h>
#include <string.h>
void main()
{    
    char s[100];
    int left, right, middle, lenth;
    printf("Please input a string:");
    gets(s) ;
    lenth=strlen(s);
    left=0;        
    middle=lenth/2;
    while (left<=middle)
    {    
        right=lenth-1-left;
        if(s[left]==s[right])left++;   //判断字符串是否对称,即a[0]=a[4]、a[1]=a[3](若字符串长度为5)
        else break;
    }
    if (left<=middle)    printf ("No\n") ;  //判断前面的while循环是否break退出循环
    else    printf ("Yes\n");   
}

七.完善程序

完善下列程序,实现如图所示的杨辉三角形。

杨辉三角形的特点:

  1. 各行第一位与最后一位都是1;
  2. 第三行开始,除(1)中位置的元素外,其余各数都是上一行同列与前列之和。
#include <stdio.h>
#define N 6
void main()
{    
    int i,j,a[N][N];
    for(i=0; i<N; i++)                    /*对第一列和主对角线元素赋值1*/
    {    
        a[i][i]=1; ________ =1;    
    }
    for(i=2; i<N; i++)                    /*对第一列和主对角线以内的元素赋值*/
        for(j=1;j<____;j++)
            a[i][j]=____________;
    for(i=0;i<N; i++)                    /*输出结果*/
    {    
        for(j=0;j<=i;j++)                /*j<=i表示只输出矩阵的主对角线及以下部分*/
            printf ("%4d",a[i][j]) ;
        printf ("\n") ;  
    }   
}

正确答案:

#include <stdio.h>
#define N 6
void main()
{    
    int i,j,a[N][N];
    for(i=0; i<N; i++)                    /*对第一列和主对角线元素赋值1*/
    {    
        a[i][i]=1;a[i][0]=1;    
    }
    for(i=2; i<N; i++)                    /*对第一列和主对角线以内的元素赋值*/
        for(j=1;j<i;j++)
            a[i][j]=a[i-1][j-1]+a[i-1][j];
    for(i=0;i<N; i++)                    /*输出结果*/
    {    
        for(j=0;j<=i;j++)                /*j<=i表示只输出矩阵的主对角线及以下部分*/
            printf ("%4d",a[i][j]) ;
        printf ("\n") ;  
    }   
}

八.选择

若要定义一个具有5个元素的整型数组,以下错误的定义语句是:

A) int a[5]={0}; B) int b[]={0,0,0,0,0}; C) int c[2 + 3]; D) int i=5, d[i];

答案:D

分析:定义数组的时候中括号里必须是常量

九.选择

若有定义语句: int m[]={5,4,3,2,1}, i=4;,则下面对m数组元素的引用中错误的是

A) m[--i] B)m[2*2] C) m[m[0]] D) m[m[i]]

答案:C

分析:声明数组时,数组的下标可以是变量。第一个下表是从0开始,如果长度为5,则最后一个元素是4。m[0]是5,而m[5]不存在。故选C。

十.选择

以下叙述中错误的是:

A)同一个数组中所有元素的类型相同

B)不可以跳过前面的数组元素,给后面的元素赋初值0

C)定义语句: int a[10]= {0};,给a数组中所有元素赋初值0

D)若有定义语句: int a[4]={1,2,3,4,5};,编译时将忽略多余的初值

答案:D

分析:数组的定义,数组不能容纳数量超过数组长度的元素。

十一.选择

#include<stdio.h>
int main()
{
    int s[12]={1, 2, 3, 4, 4, 3, 2, 1, 1, 1, 2, 3}, c[5]={0}, i;
    for(i=0;i<12;i++)
        c[s[i]]++;        //c[1]-c[4]实际统计了s[i]中相同数字的个数
    for(i=1;i<5;i++)
        printf("%d ",c[i]);
    printf("\n");
}

程序的运行结果是:

A) 1 2 3 4 B) 2 3 4 4 C) 4 3 3 2 D)1 1 2 3

答案:C

分析:s[12]中有4个1,3个2,3个3,2个4。

十二.选择

#include<stdio.h>
main( )
{    
    int a[]={2,3,5,4},i;
    for(i=0;i<4;i++)
        switch(i%2)
        {    
            case 0 : switch( a[i]%2 )
                     {    
                         case 0 : a[i]++ ; break;  //若a[]的值为偶数,则自加1
                         case 1 : a[i]-- ;         //若a[]的值为基数,则自减1
                     }
                     break;
            case 1 : a[i]=0;         //将基数下标的数置0
        }
    for(i=0;i<4;i++) 
        printf( "%d",a[i] ) ;
    printf( "\n" ) ;       
}

程序运行后的输出结果是:

A) 3344 B) 2050 C) 3040 D) 0304

答案:C

分析:

十三.选择

以下代码的功能是通过键盘输入数据,为数组中的所有元素赋值。

int x[10],i=0;
while(i<10 ) scanf("%d",_____ );

在程序中下划线处应填入的是?

A) x+i B) &x[i+1] C) x+(i++) D) &x[++i]

答案:C

分析:i++先以i代入运算再自增,++i先自增再带入运算。

十四.选择

设有定义:

int x[2][3]; 

,则以下关于二维数组x的叙述错误的是:

A) x[0]可看作是由3个整型元素组成的一维数组构成

B) x[0]和x[1]是数组名,分别代表不同的地址常量

C) 数组x包含6个元素

D) 可以用语句x[0]=0 ;为数组第一行所有元素赋初值0

答案:D

分析:多维数组定义,x[0]=0在多维数组中非法。

十五.选择

以下错误的定义语句是:

A) int x[][3]={{0},{1},{1,2,3}};

B) int x[4][3]={{1,2,3},{1,2,3},{1,2,3},{1,2,3}};

C) int x[4][]={{1,2,3},{1,2,3},{1,2,3},{1,2,3}};

D) int x[][3]={1,2,3,4);

答案:C

分析:详见C多维数组

十六.选择

有以下程序:

#include<stdio.h>
main( )
{    
    int b[3][3]={0,1,2,0,1,2,0,1,2},i,j,t=1;
    for(i=0;i<3;i++)
        for(j=i;j<=i;j++)
            t += b[i][ b[j][i] ] ;
    printf( "%d\n", t ) ; 
}

程序运行后的输出结果是:

A) 1 B) 3 C) 4 D) 9

答案:C

分析:相当于t和b数组的i=j这条对角线上的数相加。

十七.选择

下面是有关c语言字符数组的描述,其中错误的是:

A)不可以用赋值语句给字符数组名赋字符串 B)可以用输入语句把字符串整体输入给字符数组

C)字符数组中的内容不一定是字符串 D)字符数组只能存放字符串

答案:D

分析:字符数组还能存放字符。

十八.选择

设有定义: char s[81];int i=0;,以下不能将一行(不超过80个字符)带有空格的字符串正确读入的语句或语句组是:

A) gets(s);

B) while((s[i++]=getchar())!='\n');
       s[i]='\0';

C) scanf( "%s" ,s);

D) do{scanf( "%c" ,s+i);}
   while(s[i++]!='\n');
       s[i]='\0';

答案:C

分析:%s、%d都会忽略开头遇到的空格,遇到空格则结束读入,而gets可以接收空格。

十九.选择

下列叙述中正确的是:

A)可以用关系运算符比较字符串的大小

B)空字符串不占用内存,其内存空间大小是0

C)'\\'是不合法的字符常量,因为超过了一个字节

D)两个连续的双引号是合法的字符串常量

答案:D

分析:详见C语言学习笔记中的九.字符串

二十.选择

若有定义:

int a[2][3];

,以下选项中对a数组元素正确引用的是:

A) a[2][!1]        B) a[2][3]            C) a[0][3]            D)a[1>2][!1]

答案:D

分析:1>2输出为0,!1输出也为0,故D选项等同于

a[0][0]

二十一.选择

有以下程序:

#include <stdio.h>
main( )
{    
    char s[ ]="012xy\08s34f4w2" ;  //如果"012xy\07s34f4w2"呢
    int i, n=0;
    for( i=0; s[i]!=0;i++ )
        if( s[i] >= '0' && s[i] <= '9' )n++ ;
    printf( "%d\n", n ) ;        
}

程序运行后的输出结果是:

A) 0 B) 3 C) 7 D) 8

答案:B

若改为"012xy07s34f4w2",则答案选C

分析: '07'是转义字符,表示响铃(BEL)

二十二.选择

有以下程序:

#include<stdio.h>
main( )
{    
    char ch[3][5] = { "AAAA","BBB","CC"};
    printf( "%s\n",ch[1] ) ;  
}

程序运行后的输出结果是? D

A) AAAA B) CC C) BBBCC D) BBB

分析:输出ch数组的第二行的元素。

二十三.选择

有以下程序:

#include<stdio.h>
main( )
{    
    char a[5][10] = {"one","two","three","four","five"};
    int i,j;
    char t ;
    for(i=0;i<4;i++)
        for(j=i+1;j<5 ;j++)
            if( a[i][0]>a[j][0] ){t = a[i][0] ;a[i][0] =a[j][0] ;a[j][0] =t; }  //找出a数组每一列中最小的字母并将其上移至当列的第一行
    puts( a[1] ) ;    
}

程序运行后的输出结果是? A

A) fwo B) fix C) two D) owo

二十四.选择

有定义语句: char s[10];,若要从终端给s输入5个字符,错误的输入语句是?D

A) gets( &s[0]); B) scanf( "%s" ,s+1); C) gets(s); D) scanf( "%s" ,s[1]);

分析:s[1]不是一个地址,应为&s[1]。

二十五.选择

有以下程序:

#include<stdio.h>
main( )
{    
    char a[30], b[30];
    scanf("%s", a) ;
    gets(b);
    printf( "%s\n%s\n", a, b);   
}

程序运行时若输入:how are you? I am fine<回车>

则输出结果是?B

A.how are you?
   Iam fine    
B.how
   are you? Iam fine
C.how are you? Iam fine
D.howare you?

分析:%s、%d都会忽略开头遇到的空格,遇到空格则结束读入,而gets可以接收空格。

二十六.选择

有以下函数:

#include<stdio.h>
main( )
{    
    char a[20], b[20], c[20];
    scanf("%s%s",a,b);
    gets(c);
    printf( "%s%s%s\n", a, b, c);     
}

程序运行时从第一行开始输入:This is a cat!<回车>,则输出结果是?C

A) Thisisacat! B) Thisisa C) Thisis a cat! D) Thisisa cat!

分析:%s、%d都会忽略开头遇到的空格,遇到空格则结束读入,而gets可以接收空格。

二十七.选择

有以下程序:

#include<stdio.h>
#include<string.h>
main( )
{    
    char  x[ ] ="STRING";
    x[0]= 0 ;     x[1] = '\0';    x[2]='0' ;   
    printf( "%d %d\n", sizeof(x), strlen(x)) ; 
}

程序运行后的输出结果是? B

A) 61 B) 70 C) 63 D)71

如果第六行为

x[0]='0'; x[1] = '\0';x[2]=0 ;  

则结果为 D

分析:

  • sizeof是计算该数组所占字节数,而不是数组元素个数。
  • strlen而言,不管是数组还是指针,只要遇到第一个‘0’就为止。

二十八.选择

有以下函数:

#include<stdio.h>
#include<string.h>
main( )
{    
    printf( "%d\n", strlen( "ATS\n012\1" ) );        
}

程序运行后的输出结果是?B

A) 3 B) 8 C) 4 D) 9

分析:为转义字符,n记为一个字符,1也记为一个字符。

二十九.选择

有以下程序(strcpy为字符串复制函数,strcat为字符串连接函数):

#include<stdio.h>
#include<string.h>
main( )
{    
    char a[10] ="abc", b[10]="012", c[10] ="xyz";
    strcpy( a+1, b+2);
    puts (strcat( a, c+1));   
}

程序运行后的输出结果是? C

A)a12xyz B) 12yz C) a2yz D) bc2yz

分析:

  • strcpy(a+1,b+2); 是说把b+2(b[2])地址后以后直到'0'为止这一段字符串复制到a+1(a[1])地址之后。所以第六行执行后a为"a2"。
  • puts(strcat(a,c+1)); 这一句是说把c+1(c[1])后的字符串连接到a开始的字符串后面然后显示出来。

三十.选择

有以下程序:

#include<stdio.h>
#include<string.h>
main( )
{    
    char a[5][10] = { "china", "beijing", "you", "tiananmen", "welcome" } ;
    int i,j;char t[10] ;
    for(i=0;i<4;i++)
        for(j=i+1; j<5; j++)
            if( strcmp( a[i], a[j] )> 0) { strcpy(t, a[i]) ; strcpy( a[i], a[j] ) ; strcpy( a[j],t) ;  }
    puts(a[3]);    
}

程序运行后输出结果是? C

A) bejing B) china C) welcome D) tiananmen

分析:将a数组中最大的字符串放至第一行,并输出。

三十一.选择

以下程序运行时,输出结果中第一行是? 6 第二行是? 2

#include <stdio.h>
#define N 4
int main ()
{    
    int i=3, j, k=6;
    int a[5]={5,3,2,1};
    while(i>0 && k>a[i])    i--;
    for(j=N-1;j>=i;j--)    a[j+1]=a[j];              //右移三位
    a[j+1]=k;                                     //为第一位赋值6(不跟在for循环后面)
    for(i=0;i<=N;i++)
        if(a[i]%2== 0)    printf("%3d\n" ,a[i]);   //输出a数组中的偶数    
}

三十二.选择

以下程序运行时,输出到屏幕的结果中第一行是? 第二行是?

#include <stdio.h>
int main()
{    
    int a[100]={0}, b[]={2, 4, 5, 3, 6, 5, -1}, x;
    int i=0;
    while(b[i]>-1)
    {    
        x=b[i]; a[x]++; i++;        //赋值:a[2]=1,a[3]=1,a[4]=1,a[5]=2,a[6]=1
    }
    for(x=0, i=0;i<100;i++)
        while(a[i])              //非0的数都是“真”,“真”表示执行
        {    
            x++;              //x计算进入while循环次数
            (x%3==0)?printf("%4d\n", a[i] ) : printf("%4d",a[i] );   
            a[i]--;           //a[5]的值减去1之后,再次进入循环,输出1
        }
}  

输出结果:

   1   1   1
   2   1   1

三十三.选择

以下程序运行时,输出到屏幕的结果中第一行是?0 2 3 第二行是?2 3 5 第三行是?7 11 13

#include <stdio.h>
#include <math.h>
void main()
{    
    int a[100]={0},i,j,k;
    for(i=1;i<100;i++)    a[i]=i+1;     //a[0]=0,a[0]后为首项为2,公差为1的数列
    printf("%4d%4d%4d\n", a[0] , a[1] , a[2] );
    for(j=1;j<100;j++)
        if(a[j]!=0)
            for(k=j+1;k<100;k++)    
                if(a[k]%a[j]==0) a[k]=0;     //将a[]中非质数置0
    for(k=1, i=0;k<100;k++)
        if(a[k]!=0)
        {    
            printf("%4d", a[k]);    
            i++;        
            if(i%3==0) printf("\n");  //输出a[]中的非0数,每行输出三个
        }  
}

三十四.问答

假设一个double类型的数据在内存中存放需要分配8个字节,若有

double a[3][4]

则sizeof(a)的值是? 96

sizeof(a[1][1])

的值是? 8

分析:

  • 数组名a有两个内部的含义:

1.数组首地址
2.(数组占有类型)X(个数)

  •   a[1][1]为一个数据

    三十五.问答

    若有语句:

int a3;


,按在内存中的存放顺序,a数组的第10个元素是?

**答案:**

a1


**分析:数组在内存中存放顺序为先行后列。**

## 三十六.问答

有以下程序:

include <stdio.h>

void main ()
{

int a[4][4]={ 1,2,3,4,2,2,5,6,3,5,2,7,4,6,7,4 } ;
int i, j, flag=1;
for(j=0; j<4; j++)
    for(i=0; i<j; i++)                
    {    
        if(a[j][i]==a[i][j]) continue;//如果进入if语句,则cotinue执行,进行下一次for循环,跳过flag赋值
        flag=0;                         
    }
if(flag==0) printf ("No!\n");
else printf("All Right!\n");   

}


程序运行后输出的结果是?该段程序的作用是?

**答案:**

All Right! 判断该矩阵是否按对角线对称


## 三十七.改错

以下程序有4个错误,请根据题意进行修改,使程序能够正确运行。

程序功能:求一个3行4列矩阵的**外框元素值**之和。例如,矩阵元素为1,2,3,4,5,6,7,8,9,10,11,12时,**外框元素值**之和应为65。

include <stdio.h>

int main()
{

int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int i, j, s, s1=s2=s3=s4=0; //错误1
int m=3, n=4;                
for(j=0; j<n; j++)          //先累加每列上下两个元素
{    
    s1=s1+a[0][j];
    s2=s2+a[m][j];           //错误2
}    
for (i=0; i<m; i++)            //累加每行左右两个元素,且矩阵四个角上的元素不重复。错误3
{    
    s3=s3+a[i][0];
    s4=s4+a[i][n-1];    
}
s=s1-s2-s3-s4;              //错误4
printf ("total=%d\n",s);        

}


**答案:**

include <stdio.h>

int main()
{

int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int i, j, s, s1=0,s2=0,s3=0,s4=0; //修改1
int m=3, n=4;                
for(j=0; j<n; j++)                  //先累加每列最上面和最下面两个元素
{    
    s1=s1+a[0][j];
    s2=s2+a[m-1][j];               //修改2  第三行下标为a[2][j]    
}    
for (i=1; i<m-1; i++)                //修改3  不和上一步加过的元素重复,所以从第二行(a[1])开始
{    
    s3=s3+a[i][0];
    s4=s4+a[i][n-1];    
}
s=s1+s2+s3+s4;                      //修改4   将上面算出的值相加为外框元素值
printf ("total=%d\n",s);        

}


**分析:**

- 可以

int s1,s2,s3,s4;
s1=s2=s3=s4=0


- 不可以

int s1=s2=s3=s4=0


因为s1,s2,s3,s4还没有定义。

## 三十八.选择

有以下程序:

include <stdio.h>

int main()
{

int a[4][4]={{1,4,3,2},{8,6,5,7},{3,7,2,5},{4,8,6,1} }, i, j, k, t;
for(i=0;i<4;i++) 
    for(j=0;j<3;j++)
        for(k=j+1;k<4;k++)
            if(a[j][i]>a[k][i])
            {    
                t=a[j][i]; a[j][i]=a[k][i];a[k][i]=t;   
            }
for (i=0;i<4;i++)    printf ("%d,", a[i][i]);        

}


程序运行后的输出结果是?                     A

A) 1,6,5,7,         B)8,7,3,1,              C)4,7,5,2,              D)1,6,2,1,

**分析:程序的作用是将数组中每一列的数按从小到大的顺序从上往下排序后,输出数组对角线(行等于列)的数。**

**程序执行后,数组应为:**

1 4 2 1
3 6 3 2
4 7 5 5
8 8 6 7


## 三十九.问答

以下程序输出的结果是:

include <stdio.h>

void main()
{

int s, i, j, a[4][4]={{1,2,0,-1}, {3,-2,-3,0},{4,0,-5,5},{-6,6,0,7}};
for(i=0,s=0; i<4; i++)
    for(j=0; j<4; j++)
    {    
        if(a[i][j]<0) continue; 
        if(a[i][j]==0) break;     //若一行中有0,则跳到下一行,不判断当行0以后的数
        s+=a[i][j];               //当a[i][j]>0时执行,将所有a中大于0的数累加
    }
printf ("%d\n",s);        

}


输出结果:   **16**

## 四十.问答

以下程序的功能是将己知字符串中某个字符删除,生成一个新字符串。

include <stdio.h>

void main()
{

int i,j;
char s[]="hayagafeaak";
printf("The old string:%s\n",s) ;
i=j=0;
for(; s[i] !='\0'; i++)
    if (s[i] !='a') s[j++]=s[i] ;   //保留s[i]不为a的字符
s[j]='\0';                          //将字符串最后一位赋数值0,完成字符串的定义。
printf ("The new string:%s\n", s);        

}


请结合题意分析程序要删除的字符是?

答案:  **a**

## 四十一.问答

以下程序运行时,输出结果中第二行是?第四行是?

include <stdio.h>

define N 6

int main()
{

int i,j,a[N+1] [N+1];
for(i=1;i<=N;i++)
{     
    a[i][1]=1;        
    a[i][i]=1;        //将a[]数组的对角线右下部分(除第一行)赋值1
}
for(i=3;i<=N;i++)
    for(j=2;j<i;j++)
        a[i][j]=a[i-1][j-1]+a[i-1][j];   //从a[3][2]开始,将数组中的数赋值为它上面的数和这个数的前一个数相加之和
for(i=1;i<=N;i++)
{    
    for(j=1;j<=i;j++)
        printf("%d ",a[i][j]);
    printf ("\n") ;        
}        

}


答案: 

1 1 1 3 3 1


## 四十二.选择

字符串的结尾标记是字符’\0’,与其等价的是?    C

A)’0’              B)“0”          C) 0                   D)“\0”

**分析:'\0'为数值0,'0'为子符0,0为数字0,"\0"为一个字符串,有两个字符,均为数值0。**

## 四十三.选择

有定义:char s[20]=”njtech”;,在程序运行过程中,若要使数组s中的内容改为”Good”,则以下语句能实现此功能的是? D      

A) s=”Good”;              B)s[20]=”Good”;        C)strcat(s,”Good”);                      D)strcpy(s,”Good”);

**分析:**

> 注意char *s="njtech"与char s[]="njetch"的区别:
>
> 1. 字符串存放的内存区域不同:前者存放在常量区,不可修改,后则存放在栈中,可以修改;
> 2. 变量a存放的内容不同:前者存放的是一个地址,而后者存放的是字符串"abcdef"。

**strcpy把含有'\0'结束符的字符串复制到另一个地址空间,D选项中将Good从s[0]开始依次赋值给s,包括结束符,所以相当于覆盖了s原来的元素,因为一个字符串遇到'\0'则结束。**

## 四十四.选择

下列关于指针的运算中,非法的是?             D

A) 两个指针在一定的条件下,可以进行相等与不等的运算

B) 可以将一个空指针赋值给某个指针

C) 一个指针可以加上两个整数之差

D) 两个指针在一定的条件下可以相加

**分析:详情可见[C指针运算](https://stepsix.cn/2019/12/04/c-zhi-zhen-de-suan-zhu-yun-suan/)**

## 四十五.选择

设变量定义为”int d[]={1,2,3,4,5,6,7,8,9,10};*p=d;”,若要输出数组中的每个元素,正确的语句是?   A

A) for(int i=0; i<10; i++) printf("%d", p++); B) for(int i=0; i<10; i++) printf( "%d", (p)++);

C)for(int i=0; i<10; i++) printf("%d", ++p); D) for(int i=0; i<10; i++) printf("%d", ++p);


分析:

A.*p++为: 先取指针p指向的值(数组第一个元素1),再将指针p自增1
B.(*p)++为:先取指针p指向的值(数组第一个元素1),再将该值自增1(数组第一个元素变为2)
C.*++p为: 先将指针p自增1(此时指向数组第二个元素),再输出
D.++*p为: 先取指针p指向的值(数组第一个元素1),再将该值自增1(数组第一个元素变为2)
注意符号优先级,+和*同属于一个优先级,运算时自右至左看


## 四十六.选择

已知一个运行正常的程序中有下面两个语句: 

int *p1, *p2=&a; p1=b;

由此可知,变量a和b的类型分别是?   C

A)int和int B)int和int C)int和int D) int和int


**分析:&a代表变量a的内存地址,所以a为int类型,而b和p1是一个类型,为指针类型。**

## 四十七.选择

设有说明”int x[]={1,2,3,4,5},*p=x;”,下列语句中输出值不是5 (数组x的元素个数)的是?         C

A)printf(“%d\n”,sizeof(x)/sizeof(int));                B)printf(“%d\n”,sizeof(x)/sizeof(x[0]));

C)printf(“%d\n”,sizeof(p)/sizeof(int));               D) printf(“%d\n”,sizeof(x)/sizeof(1));  

**分析:p为一个直向x[0]的int*类型指针,占四个字节,sizeof(p)=4。**

## 四十八.选择

以下程序的运行结果是:  C

include <stdio.h>

void main()
{

int a[]={1,2,3,4,5,6,7,8,9,10,11,12};
int *p=a+5, *q=a+1;
q[0]=p[5]++;
printf("%d %d",a[1],a[10]);        

}


A) 1  10           B) 2 11               C) 11 12                     D) 2 6

**分析:p[5]实际指向a[10],p[5]++先将p[5]带入运算再自加。**

## 四十九.选择

若已定义”int a[9], *p=a;",并在以后的语句中未改变p的值,不能表示a[1]地址的表达式是?   C

A) p+1            B) a+1         C) a++         D) ++p

**分析:p+1和a+1等价,为指向a[1]的指针,a++先代入后自加,++a先自加后代入。**

## 五十.选择

有以下定义:

char s[20]="programming", *ps=s; 则不能代表字符'o'的表达式是?         A

A) s+=2,s B) s[2] C) ps[2] D) ps+=2,ps


**分析:s是s[]数组的首地址,指向的字符串是常量,不可改变。**

## 五十一.选择

请读程序:

include <stdio.h>

include <string.h>

void main()
{

char *s1="AbCdEf",*s2="aB";
s1++;        s2++;
printf("%d",strcmp(s1,s2));        

}


上面程序的输出结果是?                               A

A) 正数                          B) 负数                       C) 零                             D) 不确定的值

**分析:s1++和s2++后strcmp比较的是b和B,而小写字母b的ASCII码值大于大写字母B,所以输出一个正整数。**

## 五十二.选择

以下程序运行后,输出结果是?                     A

include <stdio.h>

void main()
{

char *d[]={"ab", "cde"};        
printf("%s\n ",d[1]);    

}


A) cde            B) 字符c的ASCII码值                 C) 字符c的地址                    D) 出错

**分析:%s输出字符串,即为cde。**

## 五十三.问答

下面程序的输出结果是?

include <stdio.h>

void main()
{

char *p[]={"B0OL", "OPK", "H","SP"};
int i;
for(i=3;i>=0;i--)    printf("%c",*p[i]);
printf("\n");        

}


**答案:**  SHOB

**分析:%c输出字符。**

## 五十四.选择

下列数组定义中错误的是?              B

A) char s1['a'];      B) char s2[6]="string";          C) static int a[4]={1};       D} char *p[]={"A","B","C"};

**分析:"string"包括七个字符,分别为's','t','r','i','n','g','\0'。**

## 五十五.问答

下面程序的输出是? 

include <stdio.h>

include <string.h>

void main()
{

char p1[10]="abc",*p2="ABC",str[50]="xyz";
strcpy(str+2, strcat(p1,++p2)); //++p2先自加后代入,所以strcat得到的是"abcBC",strcpy从str[2]开始覆盖
printf("%s\n",str);        

}


**答案:**   xyabcBC

## 五十六.选择

已有声明" char s1[5], *s2="Hello World;"; ",能实现“将s2指向的字符串中最后4个字符组成的子串复制到s1数组”功能的语句是?   D

A. s1=s2+strlen(s2)-3;                            B. s1[0]=s2[strlen(s2)-3];

C. strcpy(s1[0], s2[strlen(s2)-3]);            D. strcpy(s1, s2+ strlen(s2)-3);

**分析:s1[0]代表s1数组的第一个成员元素,而strcpy的实参应该是指针,即为&s1[0]。**

## 五十七.选择

设变量p是指针变量,语句p=NULL;,是给指针变量赋NULL值,它等价于?                  C

A) p=””;                  B) p=’0’;               C) p=0;                D) p=’’

**分析:Null是在计算中具有保留的值,用于指示[指针],不引用有效对象。**

## 五十八.选择

以下程序中关于指针输入格式正确的是?                C

A) int p; scanf( "%d" ,&p); B) int p; scanf( "%d" ,p);

C) int k, p= &k ; scanf( "%d" ,p); D) int k,p; *p=&k ; scanf( "%d" , p);


**分析:**

> 1. 可以用%p格式控制符输出十六进制形式的地址。
> 2. int *p=&k; 等效于int *p; p=&k;
> 3. *q=&k    前面对应的是值,后面赋值的却是地址。

## 五十九.选择

设有定义double a[10], *s=a;,以下能够代表数组元素a[3]的是?                         B

A) (*s)[3]                 B) *(s+3 )                     C) *s[3]                D) *s+3

**分析:**

A项,小括号和方括号的优先级相同,从左向右结合,先取*s的值,然后再进行方括号运算,编译错误。
C项,方括号的优先级高于,s[3]等价于(s+3),代表a[3]元素,对a[3]元素进行间址运算,编译错误。
D项,间址操作符*的优先级高于加号,先取出s指向的数据,然后加3,并不是数组元素a[3]。


## 六十.选择

有以下程序:

include<stdio.h>

main( )
{

char *s = "12134" ;
int k=0,a=0;
while(s[k+1]!='\0')   //子符串最后一位为'\0',所以s[5]为'\0',输出的k即为4
{    
    k++;
    if(k%2==0)
    {    
        a =a+s[k]-'0'+1;    
        continue ;        
    }
    a=a+( s[k]-'0');        
}
printf( "k=%d a=%d\n", k, a);        

}


程序运行后的输出结果是?                                           C

A) k=6 a=11                       B) k=3 a=14                   C) k=4 a=12                  D) k=5 a=15

## 六十一.选择

有以下程序:(注:字符a的ASCII码值是97)

include <stdio.h>

main( )
{

char *s= ("abc");
do
{    
    printf ("%d",*s%10);    ++s;
}
while(*s) ;    

}


程序运行后的输出结果是?              B

A) abc                    B) 789                C) 7890               D) 979800 

**分析:**

s是字符串指针,,*s是字符串第一个字符,也就是a,对应ASCII码值是97
则循环第一次*s%10,求余数为97%10=7
执行++s,后,*s是下一个字符B,while里面判断B为真,继续循环
同样,b对应98,98%10=8
后++s,*s为c,c为真,继续循环
c对应99,99%10=9
执行++s后到字符串结尾,为'0',此时*s为假,结束循环。


## 六十二.选择

有以下代码:

include<stdio.h>

int main()
{

char *x, *y;
int n=0;
x="..."  ;  y="...";            //各自将字符串赋值给字符指针x、y
while((*x==*y) && *x!='\0') { x++; y++; n++; }  //只要字符串x与y的当前字符不相等时或执行至字符串最后一位,循环就结束。
printf( "%d\n", n) ;     

}


程序运行后的输出结果是?               B

A) 查找x和y所指字符串中是否有’\0’            B) x、y所指字符串最前面连续相同的字符个数

C) 将y所指字符串赋值给x所指存储空间            D) 统计x和y所指字符串中相同的字符个数

## 六十三.选择

以下不能将s所指字符串正确复制到t所指存储空间的是?                      C

A) while( *t=*s ){ t++; s++; }         B) for(i=0; t[i]=s[i]; i++);

C) do{ *t++=*s++; } while(*s);              D) for(i=0,j=0; t[i++]=s[j++];); 

**分析:**

选项A中,"t=s"既完成字符的复制,又将当前复制字符的ASCII码作为循环条件。当s不断向后移动指向字符串结束标记'0'时,将s的值'0'赋值给t,'0'的ASCII码等于0,条件判断为假跳出循环。

选项B、D程序算法类似,也是把s指向的字符赋值到t指向的存储单元,并对该字符进行0和非0的判断,若等于字符'0',则跳出循环。

选项C中,使用了do…while循环,先执行循环体再进行条件判断。循环中先取出s赋值给t后,然后s和t分别自加1,指向下一个单元,最后再对s的值进行判断,若此时s等于'0',则跳出循环,字符'0'没有复制到t指向的存储单元中。所以选项C不能实现字符串的复制。


## 六十四.选择

有定义语句:int *p[4];,以下选项中与此语句等价的是?                          C

A) int p[4); B) int *p; C) int (p[4]); D) int (*p)[4];


**分析:**

int *p[4];首先声明了一个数组,数组的元素是int型的指针。
int(*p)[4];声明了一个指针,指向了一个有四个int元素的数组。
其实这两种写法主要是因为运算符的优先级,因为[]的优先级比高。所以第一种写法,p先和[]结合,所以是一个数组,后与结合,是指针。后一种写法同理。


## 六十五.选择

若有定义语句: 

int a4,p,q[4];


,且0≤i<4,则错误的赋值是?             A

A)p=a B)q[i]=a[i] C) p=a[i] D) p= &a2


**分析:A是将一个指向int类型的指针用来指向一个指针的指针,是错误的。**

## 六十六.问答

以下程序的运行结果是?                Ab3I

include<stdio.h>

int main( )
{

char s[6][6]={ "ABCDE", "abcde", "12345" , "FGHIJ", "fghij", "54321" } ;
char (*p)[6];
int i;
p=s;
for(i=0; i<4; i++ )printf("%c", p[i][i]);    //%c输出s[][]中对角线上的字符
printf("\n");    

}


## 六十七.问答

以下程序的运行结果是?                aegi

include<stdio.h>

main( )
{

char *a[] = {"abcd","ef","gh","ijk"};
  int i;
for(i=0; i<4; i++) printf( "%c",*a[i] ) ;   //%c输出a[][]每一行的的第一个字符  

}


## 六十八.选择

以下选项中有语法错误的是?                          D

A) char *str[]= {"guest"}; B) char str ={ "guest" };

C) char *str[3]; str[1]= "guest"; D) char str3; str[1]="guest";


**分析:D选项中str为二维字符数组,不能够直接把一个字符串赋值到二维数组的某一行中**

## 六十九.选择

若有int n=2,p=&n,q=p;则以下非法赋值? D

A p=q; B p=q; C n=*q; D p=n;


**分析:n是整型数值,p是整型地址,不同类**

## 七十.简答

输出结果?

include <stdio.h>

include <string.h>

main()
{

char *p="abcdefgh", *r;  long *q;
q=(long *)p;   //地址的类型转换,q获取了p[0]的地址,但是q+1,移动4个字节,因为long类型   
q++;           //移动4个字节,所以指向p[4]
  r=(char *)q;   // r指向p[4]   
printf("%s\n",r); 

}


**答案:**

efgh

## 七十一.选择

若有定义:

int a2;


则对该数组的第i行第j列元素值的正确引用为?A

A:((a+i)+j)

B:(a+i)[j] //字面意思,若(a+0)[0],即是a[0],也是(a+0),a

//若(a+1)[1],即可类推,((a+1)+1),即是(a+2),即是a[2]

C:(a+i+j) //可以((a+i)+j),也可以*(a+(i+j)),即是a[i+j]

D:*(a+i)+j //a[i]+j


**分析:**

B、C、D都是地址值(二层台阶),仅A是元素值

## 七十二.选择

若有定义:

int a3;


下列不能表示数组元素

a1


?      D

A:(a[1]+1)//按公式推导可以看成是((a[1])+1)的变形,为(a[1])[1]

B:*(&a1)

C:((a+1))[1] //(a+1)即a[1],所以是(a[1])[1],

D:*(a+5) //即a[5],是一个地址值


## 七十三.简答

以下程序运行后的输出结果是?

include <stdio.h>

main()
{

char a[]="Language",b[]="Programe";
char *p1,*p2;
int k;
p1=a;p2=b;
for(k=0;k<=7;k++)
{
    if(*(p1+k)==*(p2+k))   printf("%c",*(p1+k));
}

}//即输出两个字串里相同位置的相同字符


**答案:**

gae

## 七十四.简答

以下程序运行后的输出结果是?

include <stdio.h>

main()
{

char a[ ]="123456789",*p;int i=0;
p=a;
while (*p)//到p指向字符值为0结束,即’\0’处,循环结束
{ 
    if(i%2==0) *p='*';//下标为偶数的元素值变为字符*
    p++;   i++;
}
puts(a);

}


**答案:**

2468*


## 七十五.选择

以下赋初值错误的是?   A 

A char str[5]=”good!”        B char str[]=”good!”

C char *str=”good!”              D char str[5]={‘g’,’o’,’o’,’d’,’!’}

**分析:**

**字符数组若接收字符串,如A这种的赋值方式,只可声明的同时就赋值,其后的执行语句不能通过=赋值,只能通过函数strcpy、输入函数如scanf、gets实现。**

## 七十六.选择

以下能进行字符串赋值的是?    C

A char str[10]; str=”good!”         B char *str; gets(str)

C  char *str; str=”good!”           D char *str; strcpy( s, “good!” )

**分析:**

**76题中的C与75题中C是同一种效果,而采用的两种表示法;A错误理由见75题注释B、D错误理由一样,指针str并没有具体的地址值,即没有指向一个具体的内存单元,而gets、strcpy函数均要求参数提供一个合法的地址值,故该两项无效。**

## 七十七.选择

char a[10],*b=a;不能给a输入字符串的是?   B

A gets(a)        B  gets(a[0])      C gets(b++)      D gets(b)

**分析:**

**函数要求参数值为地址,只有B是元素值,故非法**

## 七十八.选择

设有语句“ char s[] =”Program”,*p = s;”, 则以下叙述正确的是     C    

A  数组s第一个元素的内容与指针变量p中内容相同

B  数组s的长度与 strlen ( p ) 的值相等

C  p[5]的值等于 s[5] 的值

D  sizeof( s ) 等于 sizeof( *p )

**分析:**

**A:指针变量中的内容是一个地址值,故不会和元素值相同**

**B:数组的长度指数组元素的个数,包括’\0’**

**D:sizeof( s )就是数组的长度,值为8,*p是一个元素,相当于sizeof( char ),值为1**

## 七十九.选择

如有以下定义

int y4={1,2,3,4,5,6,7,8,9,10},py1= y[1],(py2)[4]=y+1;


,则不能正确引用值为7的数组元素的表达式是?    B

A (y[1]+2) B (y+1)+2 C py1[2] D py20


**分析:**

py1是站在二层台阶上,初始和y[1]肩并肩。py2站在三层台阶上,初始从y的第二行开始,即是&y[1]。(注:*是往下层楼梯走,&是往上层楼梯走)
*(y+1)根据定义即为y[1],再执行y[1]+2,即&y1,是个地址值


## 八十.选择

若有定义:int w2,(*pw)[3];pw=w;则以下非法引用w数组元素的是? B

A:(w[0]+2) B:(pw+1)[2] C:pw0 D:*(pw[1]+2)


**分析:**

A:w[0]+2是站在二层台阶上的地址,指向了w0,故*运算即是w0

D:直接根据公式可知,(pw[1]) [2],即是w1

B:先明确运算的优先级,因为右结合,所以等价于((pw+1)[2]),(pw+1)[2]根据定义是((pw+1)+2),即(pw+3),即pw[3],因w无此行,故出错。假设w有5行,则继续运算为 pw[3],即pw3。

若((pw+1))[2]又是求的哪个元素呢?(pw+1)即pw[1],故pw1。


## 八十一.选择

若有定义:int a[]={1,2,3,4,5,6,7,8,9,10},*p=a;则以下表达式值为3的是? A

A:p+=2,p++ B:p+=2, ++p C:p+=3,p++ D:p+=3,++p


**分析:**

**B:与A运算顺序不同,先加,表达式值为4**

## 八十二.选择

运行下列程序后的输出结果是?      A

include <stdio.h>

main()
{

int a[]={1,2,3,4,5,6,7,8,9,10,11,12,},*p=a+5,*q=NULL;
*q=*(p+5);
printf("%d,%d\n",*p,*q);

}


A:运行后报错        B:6,6             C:6,11                D:5,10

**分析:**

**q没有具体指向,所以往里面放内容无意义**

## 八十三.选择

以下函数的功能是?    D

int fun(char a, char b)
{

while((*a!='\0')&&(*b!='\0')&&(*a==*b)) 
    //对应位置内容不同或其中之一到串尾则循环结束

{ a++;b++;}

return(*a-*b);

} //退出时字符差值,则相同为0,不同为正负值


A:计算a和b所指字符串的长度之差        

B:将b所指字符串连接到a所指字符串中

C:将b所指字符串连接到a所指字符串后面       

D:比较a和b所指字符串的大小

## 八十四.选择

运行下列程序后的输出结果是?   B

include<stdio.h>

main()
{

char str[][10]={"China","Beijing"},*p=*str;
printf("%s\n",p+10);

}


A:China             B:Beijing            C:ng                D:ing

**分析:**

**p+1是移动一个char,p+10移动了10个char,且注意到str一行10个char,所以p+10即str[1]处**

## 八十五.选择

下面代码段的运行结果是?    C

include<stdio.h>

include<string.h>

main()
{

char str[]="abcdefg";
char *p=str;
p+=3;
printf("%d\n",strlen(strcpy(p,"ABCD")));

}


A:8                 B:12                     C:4               D:7

**分析:**

**//p开始的字符内容为ABCD\0\0,故长度为4**

## 八十六.选择

以下程序的输出结果是?     B

include<stdio.h>

include<string.h>

main( )
{

int a[ ] = {1,2,3,4,5,6}, *p = a;
*(p+3) += 2;
printf( "%d," , *++p );
printf( "%d\n",*(p+3));

}


A:1 , 5      B:2 , 5      C:1 , 6    D:2 , 6

**分析:**

先整理一下式子:(p+3) =(p+3) + 2,而定义可知*(p+3)即为p[3],所以式子也是p[3]=p[3]+2,p[3]为6,++p指向a[1],故输出a[1],再输出a[4],因为p从&a[1]向后加3个int元素。


## 八十七.填空

若有定义语句“char str4 = {"thank" , "you" , "very" , "much!" };” 则 str数组中存储 '0' 的数组元素有 ? 个。 63


**分析:**

**总共4*20有80个元素,有效内容一一数来共有5+3+4+5,17个,则80-17为63**

## 八十八.简答

执行以下程序后输出结果是?    2

include<stdio.h>

include<string.h>

main( )
{

char *p[10]={"abc","aabdfg","dcdbe","abbd","cd"};
printf("%d\n",strlen(p[4]));

}


## 八十九.简答

以下程序后输出结果是?    53

include<stdio.h>

include<string.h>

main( )
{

int i,x[3][3]={9,8,7,6,5,4,3,2,1},*p=&x[1][1];
for(i=0;i<4;i+=2)printf("%d", p[i]);

}


分析:

注意p的起始位置,即p[0]是x1。不妨尝试输出p[-1],p[-4]看看有无这些元素


## 九十.简答

以下程序后输出结果是?  12345678

include<stdio.h>

include<string.h>

main( )
{

char ch[3][4]={"123","456","78"},*p[3];int i;
for(i=0;i<3;i++) p[i]=ch[i];
for(i=0;i<3;i++) printf("%s", p[i]);

}


**分析:**

**p是指针数组,p[0]~p[2]分别指向三个字串的首字符。再连续输出三个字串**

## 九十一.简答

以下程序后输出结果是?  Afgd

include<stdio.h>

include<string.h>

main( )
{

char str[50]="ABCDEFG",*p1,*p2;
p1="abcd";  p2="efgh";
strcpy(str+1,p2+1);  strcpy(str+3,p1+3);  
printf("%s",str);

}


**分析:**

**第一次拷贝,注意str+1是开始位置,故完成后,str:Afgh\0FG\0;**

**第二次拷贝后,str:Afgd\0FG\0,输出从str首字符开始,到第一个\0结束**

## 九十二.简答

以下程序后输出结果是? [各单词之间有一个空格] 

include<stdio.h>

include<string.h>

main( )
{

char str1[ ]="How do you do",*p1=str1;
strcpy(str1+strlen(str1)/2,"es she"); 
printf("%s\n",p1);

}


答案:

How does she

## 九十七.选择

写出下列程序的运行结果:    C

include<stdio.h>

include<string.h>

main()
{
char *letter[5]={"a","cdef","ght","ijk","lm"};
char **ptr;
int i;
ptr=letter;
for(i=0;i<4;i++)

printf("%s",ptr[i]);  //即letter[i],存的也是指针,指向i行的字串

printf("n");
}


A.ghtijklm       B.a cdef ght ijk        C.acdefghtijk           D.cdefghtijklm

## 九十八.选择

写出下列程序段执行后的结果:     D

include<stdio.h>

include<string.h>

main()
{

static int a[]={1,3,5,7,9};  int y, x, *p;
y=1;
p=&a[1];    //p[0]是a[1]
for(x=0;x<3;x++) y*=*(p+x);
printf("%d",y);

}

最后修改:2020 年 02 月 06 日 11 : 56 AM
如果觉得我的文章对你有用,请随意赞赏