若有如下程序: sub(p,n) int(*p)[3],n; { int i; for(i=0;i<=n;i++) printf("%d",*(*(p+i)+n)); } main() {int s[3][3]={1,2,3,4,5,6,7,8,9}; sub(s,2); } 则程序运行后的输出结果是( )A.3 6 9B.2 4 8C.4 5 6D.7 8 9

题目

若有如下程序: sub(p,n) int(*p)[3],n; { int i; for(i=0;i<=n;i++) printf("%d",*(*(p+i)+n)); } main() {int s[3][3]={1,2,3,4,5,6,7,8,9}; sub(s,2); } 则程序运行后的输出结果是( )

A.3 6 9

B.2 4 8

C.4 5 6

D.7 8 9


相似考题
更多“若有如下程序:sub(p,n)int(*p)[3],n;{ int i;for(i=0;i<=n;i++)printf("%d",*(*(p+i)+n));}main( ”相关问题
  • 第1题:

    设有如下程序: fun(float*p1,int n,float*p2,int m,float*s) {int i; *s=0.0; for(i=0;i<n;i++)*s+=*p1++; for(i=0;i<m;i++)*s+=*p2++; } main() { float a[]={1.1,2.2},b[]={1.0,2.0,3.0),*s=a; fun(a,2,b,3,s); printf("%f\n",*s); } 上面程序的输出结果是______。

    A.8.2

    B.9.3

    C.3.3

    D.1.1


    正确答案:A
    解析:实参指针变量s指向数组a的第一个元素,在函数fun中首先将s所指数组a的第一个元素赋值为0.0,然后将数组a和b中的元素值依次累加到数组a的第一个元素中。

  • 第2题:

    下列给定的程序中,函数fun()的功能是:用选择法对数组中的n个元素按从大到小的顺序进行排序。请改正程序中的错误,使它能得到正确结果。

    注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

    试题程序:

    include<stdio.h>

    define N 20

    void fun(int a[ ],int n)

    {

    int i,j,t,p;

    /*************found*************/

    for(j=0;j<n-1;j++) ;

    {

    p=j;

    for(i=j;i<n;i++)

    if(a[i)>a[p])

    p=i;

    t=a[p];

    a[p]=a[i];

    /*************found**************/

    a[p]=t;

    }

    }

    main()

    {

    int a[N]={11,32,-5,2,14},i,m=5;

    printf(“排序前的数据:”);

    for(i=0;i<m;i++)

    printf(“%d”,a[i]);

    printf(“\n”);

    fun(a,m);

    printf(“排序后的顺序:”);

    for(i=0;i<m;i++)

    printf(“%d”,a[i]);

    printf(“\n”);

    }


    正确答案:(1)错误:for(j=0;jn-1;j++); 正确:for(j=0;jn-1;j++) (2) 错误:a[p]=t 正确:a[j]=t;
    (1)错误:for(j=0;jn-1;j++); 正确:for(j=0;jn-1;j++) (2) 错误:a[p]=t 正确:a[j]=t; 解析:错误1:根据C语言语法,for循环中循环条件后不加分号,除非做空操作。错误2:将两数进行交换的常用语句,借助第三个变量。

  • 第3题:

    假如整数数列中的数不重复,并存放在数组中。下列给定的程序中,函数fun()的功能是:删除数列中值为X的元素。 N中存放的是数列中元素的个数。

    请改正程序中的错误,使它能够得出正确的结果。

    注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

    试题程序:

    include<stdio.h>

    define N 20

    fun (int *a,int n,int x)

    {int p=0,i;

    a[n]=x;

    while (x!=a[p])

    p=p+1;

    if(p==n) return -1;

    else

    {for (i=p;i<n;i++)

    /*************found**************/

    a[i+1]=a[i];

    return n-1;

    }

    }

    main()

    {int w[N]={-3,0,1,5,7,99,10,15,30,90},

    x,n,i;

    n=10;

    printf("The original data :\n");

    for (i=0;i<n;i++) printf("%5d",w[i]);

    printf("\nInput x (to delete ): ");

    scanf("%d",&x);

    printf("Delete : %d\n",x);

    n=fun(w,n,x);

    if (n==-1) printf("***No be found!

    ***\n\n");

    else

    {printf("The data after deleted:\n");

    for (i=0;i<n;i++) printf("%5d",

    w[i]);printf("\n\n");

    }

    }


    正确答案:错误:a[i+1]=a[i]; 正确:a[i]=a[i+1];
    错误:a[i+1]=a[i]; 正确:a[i]=a[i+1]; 解析:上机改错题有一个优势,就是我们可以执行该程序,根据错误的提示再一步一步实现改错的目的,我们先不看程序是什么意思,甚至不用看它在求什么。按Ctrl+F9快捷键,然后看看屏幕提示。另外,审题时我们必须要注意“不要改动main()函数,不得增行或减行,也不得更改程序结构”,这样;对我们来说,只要读懂题意,对程序执行部分:
    {int p=0,i;
    a[n]=x;
    while (x!=a[p])
    p=p+1;
    if (p==n) return -1;
    else
    { for (i=p;in;i++)
    a[i+1]=a[i];
    return n-1;
    }
    逐步分析,再应用平时的常识加以区分,琢磨,相信答案不攻自破,这种考题,按Ctrl+F9快捷键后,屏幕一般都不会提示错误,否则就显得太儿科了一点,所以,我们并不需要着急去找错误,而是把程序读懂。

  • 第4题:

    有以下程序:includevoid f(char p[][10],int n){char t[10];int i,j;for(i=0;i

    有以下程序: #include<string.h> void f(char p[][10],int n) {char t[10];int i,j; for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) if(strcmp(p[i],p[j])>0) {strcpy(t,p[i]);strcpy(p[i],p[j]);strcpy(p[j],t);} } main() {char p[5][10]={"abc","aabdfg","abbd","dedbe","cd"}; f(p,5); printf("%d\n",strlen(p[0]));} 程序运行后的输出结果是( )。

    A.2

    B.4

    C.6

    D.3


    正确答案:C
    解析:本题考核的是二维字符数组按行存放字符串、二维数组名作为函数的参数以及字符串的排序。主函数中定义了一个二维字符串数组p并按行赋值,调用f()函数,将字符串从小到大排序,strcmp()函数的功能是对两个字符串作向右逐个字符比较,直到出现不同的字符或遇到“\0”为止。如果全部字符都相同,则认为相等;若出现不同的字符.则以第一个不相同的字符的比较结果为准。由此可知最小的字符串是“aabdfg”,排序后存放在p[0]中,最后在主函数中输出p[0]的长度。

  • 第5题:

    有以下程序 include void fun(int a[],int n) { int i,t; for(i=0;

    有以下程序 #include <stdio.h> void fun(int a[],int n) { int i,t; for(i=0;i<n/2;i++) {t=a[i]; a[i]=a[n-1-i]; a[n-1-i]=t;} } main() {int k[10]={1,2,3,4,5,6,7,8,9,10},i; fun(k,5); for(i=2;i<8;i++) printf("%d",k[i]); printf("\n"); } 程序的运行结果是______。

    A.345678

    B.876543

    C.1098765

    D.321678


    正确答案:D
    解析:在主函数中,定义了一维数组k,并通过调用fun函数将形参数组a指向实参数组k所在的存储单元,这样,a和 k共用同一存储单元,所以对数组a的元素值的改变相当于对相应数组k的元素值的改变。在fun函数中,通过for循环对数组元素a[0]与a[4]、a[1]与a[3]的值分别作了交换,也即相当于主函数中k[0]与k[4]、k[1]与k[3]的值分别作了交换,此时k中各元素的值为5,4,3,2,1,6,7,8,9,10,故输出k[2]到k[7]的值为321678。

  • 第6题:

    以下程序输出正确的是_______ amovep(int *p,int (*a)[3],int n) { int i,j; for(i=0;i<n;i++) for(j=0;j<n;j++){ *p=a[i][j];p++;} } main() {int *p,a[3][3]={{1,3,5}, {2,4,6}}; p=(int*)mallox(100) amovep)p,a,3); printf("%d%d\n",p[2],p[5]);free(p) }

    A.56

    B.25

    C.34

    D.程序错误


    正确答案:A
    解析:本题main函数中定义了指针p和二维数组a,通过函数amovep将数组的值存入指针p所指向的存储单元中,a的各元素分别:a[0][0]=1,a[0][1]=3,a[0][1]=3,a[0][2]=5,a[1][2]=2,a[1][1]=4,a[1][2]=6,a[2][0]=0,a[2][1]=0,a[2][2]=0。通过malloc()函数给指针分配内存空间,free()函数用于释放指针变量所用内存空间。在主函数中通过amovep(p,a,3)调用函数amovep,使得实参p与形参P,实参数组a与形参中指向数组的指针变量共用同一存储空间。最后输出p[2],p[5]为56。

  • 第7题:

    有以下程序

    #include <stdio.h>

    void func(int n)

    { int i;

    for(i=0;i<=n;i++) printf(”*”);

    printf(”#”).

    }

    main( )

    { func(3); printf(”???? ”); func(4); printf(”\n”); }

    程序运行后的输出结果是

    A)****#????***#

    B)***# ????*** *#

    C)**#????*****#

    D)****#????*****#


    正确答案:D
    【答案】D
    【知识点】函数调用中形参与实参的关系
    【解析】第一次调用实参为3,所以形参变量n为3,打印四个*号后打印一个#号。然后在主函数中打印四个?。再次调用func函数,实参值为4,所以形参n的值为4,按照循环,打印五个*号后结束循环,再打印一个#号。

  • 第8题:

    请编写函数fun(),该函数的功能是:移动一维数组中的内容,若数组中有n个整数,要求把下标从0到p(p≤n-1)的数组元素平移到数组的最后。

    例如,一维数组中的原始内容为1,2,3,4,5,6,7, 8,9,10,11,12,13,14,15,p的值为3。移动后,一维数组中的内容应为5,6,7,8,9,10,11,12,13,14,15, 1, 2, 3, 4。

    注意:部分源程序给出如下。

    请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。

    试题程序:

    include <stdio.h>

    define N 80

    void fun(int *w, int p, int n)

    {

    }

    main ()

    {

    int a[N]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

    int i, p, n=15;

    printf("The original data:\n");

    for(i=0;i<n;i++)

    printf("%3d",a[i]);

    printf("\n\nEnter p: ");

    scanf("%d",&p);

    fun(a,p,n);

    printf("\nThe data after moving:\n");

    for(i=0;i<n;i++)

    printf("%3d",a[i]);

    printf("\n\n");

    }


    正确答案:void fun(int *wint pint n) { int i j t; for(i=0; i=p; i++) /*循环左移p+1次*/ {t=w[0]; for(j=1/jn;j++) /*实现循环左移*/ w[j-1]=w[j]; w[j-1]=t; } }
    void fun(int *w,int p,int n) { int i, j, t; for(i=0; i=p; i++) /*循环左移p+1次*/ {t=w[0]; for(j=1/jn;j++) /*实现循环左移*/ w[j-1]=w[j]; w[j-1]=t; } } 解析:本题采用“循环左移”的算法(关于“循环左移”,我们在后面的试题中有详细的解释)。和我们在前面分析的稍有不同的是,一个是整型数组,一个是字符型数组。

  • 第9题:

    有以下程序includevoid fun(float* p1,int n1,float,*p2,int n2,float* s){ int i;s=(

    有以下程序 #include<stdio.h> void fun(float * p1,int n1,float,*p2,int n2,float * s) { int i; s=(float *)calloc(1,sizeof(float)); *s=0; for(i=0;i<n1;i++) *s+=*p1++; for(i=0;i<n2;i++) *s+=*p2++; } main() { float a[2]={1.1,2.2},b[3]={10.0,20.0,30.0),*s=a; fun(a,2,b,3,s); printf("%f\n",*s); } 上面程序的输出结果是( )

    A.60

    B.3.3

    C.63.3

    D.1.1


    正确答案:D

  • 第10题:

    以下程序输出正确的是______。 amovep(int *pint(*a) [3]int n) { int i,j; for(i=0;i<n;i++) for(j=0;j<n;j++){ *p=a[i][j];p++;} } main() {int *p,a[3][3]={{1,3,5},{2,4,6}}; p=(int*)malloc (100); amovep(p,a,3); printf("%d%d\n",p[2]p[5];free(p); }

    A.56

    B.25

    C.34

    D.程序错误


    正确答案:A
    解析:本题main函数中定义了指针p和二维数组a,通过函数amovep将数组的值存入指针p所指向的存储单元中,a的各元素分别为:a[0][0]=1,a[0][1]=3,a[0][2]=5……,a[2][0],a[2][1]=0,a[2][2]=0。通过mallo()函数绐指针分配内存空间,free()函数用于释放指针变量所用内存空间。在主函数中通过amovep(p,a,3)调用函数amovep,使得实参p与形参p,实参数组a与形参中指向数组的指针变量共用同—存储空间。最后输出p[2],p[5]为56。

  • 第11题:

    有以下程序:struct S{int n;int a[20];};void f(struct S*P){int i,j,t;for(i=0;in-1;i++)fo

    有以下程序: struct S{int n;int a[20];}; void f(struct S*P) { int i,j,t; for(i=0;i<P->n-1;i++) for(j=j+1;j<P->n-1;j++) if(p->a[i]>p->a[j]) {t=P->a[i];p->a[i]=P->a[j];p->a[j]=t} } main() {int i;struct S s{10,{2,3,1,6,8,7,5,4,10,9}}; f(&s); for(i=0;i<s.n;i++)printf("%d",s.a[i]);} 程序运行后的输出结果是( )。

    A.3

    B.4

    C.5

    D.6


    正确答案:A
    解析:在主函数main()中定义了一个整型变量i和一个结构体变量s。f()函数中,定义了一个结构体指针类型的指针p,外层循环变量i表示数组的第i个元素,内层循环j表示数组的第i+1个元素,调用f()函数,通过指针变量p来引用结构体成员,并把它们进行从小到大排序,最后输出。

  • 第12题:

    有以下程序:include main(){ int i,n=0;for(i=2;i<5;i++){do {if(i%3) continue;n++;

    有以下程序: #include <stdio.h> main() { int i,n=0; for(i=2;i<5;i++) { do { if(i%3) continue; n++; } while(! i); n++; } printf("n=%d\n",n); } 程序执行后的输出结果是( )。

    A.n=5

    B.n=2

    C.n=3

    D.n=4


    正确答案:D
    解析:for循环中,当i=2时,i%3为真,结束本次while循环,!i为假,执行n++,n为1;当i=3时,i%3=0,执行n++,n为2,!i为假,执行n++,n为3;当i=4时,i%3为真,结束本次while循环,!i为假,执行n++,n为4;当i=5时,for循环结束。这时输出n=4。

  • 第13题:

    下列给定程序中fun()函数的功能是:将n个无序整数从小到大排序。

    请改正程序中的错误,使它能得出正确的结果。

    注意;不要改动main函数,不得增行或删行,也不得更改程序的结构。

    试题程序:

    include <conio.h>

    include <stdio.h>

    include <stdlib.h>

    fun(int n, int *a)

    { int i,j,p,t;

    for (j=0;j<n-1;j++)

    { P=j;

    /***************found*******************/

    for(i=j+l;i<n-1;i++)

    if (a[p]>a[i])

    /***************found*******************/

    t=i;

    if (p!=j)

    {t=a[j];a[j]=a[p];a[p]=t;}

    }

    }

    putarr( iht n,int *z)

    {int i;

    for (i=l;i<=n;i++,z++)

    { printf("%4d",*z);

    if (!(i%10)) printf("\n");

    } printf ("\n");

    }

    main ()

    {int aa[20]={9,3,0,4,1,2,5,6,8,10,7},n=11;

    clrscr();

    printf("\n\nBefore sorting %d numbers:\n",n); putarr(n,aa);

    fun(n,aa);

    printf("\nAfter sorting %d numbers:\n",n);putarr(n,aa);

    }


    正确答案:(1)错误:for(i=j+1;in-1;i++) 正确:for(i=j+1;in;i++) (2)错误:t=i; 正确:p=i;
    (1)错误:for(i=j+1;in-1;i++) 正确:for(i=j+1;in;i++) (2)错误:t=i; 正确:p=i; 解析:该程序是对n个数实现从小到大的排序,该题中先是找小输入整数的最小项,置于指针第1个元素的位置:再找出第2个元素至尾元素的最小项,置于第2个元素的位置;之后顺次处理后读元素。

  • 第14题:

    下列给定的程序中,函数fun()的功能是:用选择法对数组中的n个元素按从小到大的顺序进行排序。

    请改正程序中的错误,使它能得出正确的结果。

    注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

    试题程序:

    include<stdio.h>

    define N 20

    void fun(int a[],int n)

    {int i,j,t,p;

    for (j=0;j<n-1;j++)

    /*************found**************/

    {p=j

    for(i=j;i<n;i++)

    if(a[i]<a[p])

    /*************found**************/

    p=j;

    t=a[p]; a[p]=a[j]; a[j]=t;

    }

    }

    main()

    {int a[N]={9.6,8,3,-1},i,m=5;

    printf("排序前的数据: ");

    for(i=0;i<m;i++) printf("%d",a[i]);

    printf("\n");

    fun(a,m);

    printf("排序后的顺序: ");

    for(i=0;i<m;i++) printf("%d",a[i]);

    printf("\n");

    }


    正确答案:(1)错误:p=j 正确:p=j; (2) 错误:p=j; 正确:p=i;
    (1)错误:p=j 正确:p=j; (2) 错误:p=j; 正确:p=i; 解析:题中所提到的“从小到大”的顺序。这类题都可以利用选择法,即从后N个比较过程中,选择一个最小的与第一个元素交换,依次类推,即用第二个元素与后N-1个进行比较,并进行交换。该题也是与我们常见的C语言排序题类似,当然也是改错和编程题中的重点,请看同类试题,以便达到举一反三的目的。

  • 第15题:

    若有以下程序:includeint a[]={2,4,6,8};main(){int i; int *p=a; for(i=0;i<4;i++)a[

    若有以下程序: #include<stdio.h> int a[]={2,4,6,8}; main() { int i; int *p=a; for(i=0;i<4;i++) a[i]=*p; printf("%d\n",a[2]); } 上面程序的输出结果是( )。

    A.6

    B.8

    C.4

    D.2


    正确答案:D
    解析:在C语言中,数组元素的下标是从0开始的。for循环语句中,指针变量p始终指向数组a的首地址,因而执行循环赋值语句后数组各元素的值均变为2。

  • 第16题:

    有如下程序 main() { int n[5]={0,0,0},i,k=2; for(i=1;i<3;i++)n[i]=n[i]+1; printf("%d\n",n[k]); }该程序的输出结果是______。

    A.不定值

    B.2

    C.1

    D.0


    正确答案:C

  • 第17题:

    有以下程序 include define N 4 void fun(int a[][N],int b[]) { int

    有以下程序 #include <stdio.h> #define N 4 void fun(int a[][N],int b[]) { int i; for(i=0;i<N;i++) b[i]=a[i][i]; } main() {int x[][N]={{1,2,3},{4},{5,6,7,8},{9,10} },Y[N],i; fun(x,y); for(i=0;i<N;i++) printf("%d,",y[i]); printf("\n"); } 程序的运行结果是______。

    A.1,2,3,4,

    B.1,0,7,0,

    C.1,4,5,9,

    D.3,4,8,10,


    正确答案:B
    解析:在主函数中,定义并初始化了4行4列的二维数组x。对于二维数组元素的赋值,可以只对部分元素赋初值,未赋初值的元素自动取0。x数组元素赋初值后各元素为:

    fun函数的作用是将二维数组a中主对角线元素赋给数组b,由于数组a与数组x共用同一存储单元,也即将数组x中主对角线元素赋给了数组b。又因为数组b与数组y共用同一存储单元,所以主函数中通过语句“printf("%d,"y[i]);”输出的即为数组b中的值,所以程序运行结果为“1,0,7,0,”。

  • 第18题:

    有以下程序: #include<stdio.h> void func(int n) { int i; for(i=0;i<=n;i++)printf("*"): printf("#"); } main( ) {func(3);printf("????");func(4);printf("n\"); 程序运行后的输出结果( )。

    A.****#????***#

    B.***#????****#

    C.**#????****#

    D.****#????*****#


    正确答案:D
    本题考查简单的for循环,func(3)由于i是从0开始,所以会输出四个“*”和一个“#”,然后打印四个“?”func(4),会输出五个“*”和一个“#”,所以答案选择D。

  • 第19题:

    有以下程序:

    main()

    { int a[3][3],*p,i;

    p=&a[0][0];

    for(i=0;i<9;i++)p[i]=i+1;

    printf("%d\n",a[1][2]);

    }

    程序运行后的输出结果是【 】。


    正确答案:6
    6 解析:本题定义了二维数组a和指针变量p,p指向数组的首地址,for循环语句的功能是给数组元素赋值,结果为a[0][0]=1、a[0][1]=2、a[0] [2]=3、a[1][0]=4、a[1][1]=5、a[1][2]=6、a[2][0]=7、a[2][1]=8、a[2][2]=9,故printf函数的输出结果为6。

  • 第20题:

    有以下程序 fun(char p[][10]) {int n=0,i; for(i=O;i<7;i++) if(p[i][O]=T)n++; return n; } main() {char str[][10]={"Mon","Tue","Wed","Thu","Fri", "Sat","Sun"}; printf("%d\n",fun(str)); }

    A.1

    B.2

    C.3

    D.0


    正确答案:B
    解析:此题考核的是数组名作为函数参数,当数组名作为函数参数时,是将实参数组的起始地址传送给形参数组,作为形参数组的首地址,当形参发生变化主函数中的实参数组也发生变化。调用fun()函数执行for循环语句,n=2,传递给实参其输出值相应的也为2。

  • 第21题:

    请完成函数fun(),它的功能是:用选择法对数组中n个元素按从大到小的顺序进行排序。

    注意:部分源程序给出如下。

    请勿改动主函数main和其他函数中的任何内容,仅在下划线上填入所需的内容。

    include<stdio.h>

    define N 20

    void fun(int a[],int n)

    {

    int i,j,t,p;

    for(j=0;j<n-1; 1 )

    { p=j;

    for(i=j;i<n;i++)

    if(a[i] 2 a[p]

    p=i;

    t=a[p];

    a[p]=a[j];

    a[ 3 ]=t;

    main()

    {int a[N]={11,32,-5,2,14},i,m=5;

    for(i=0;i<m;i++)

    printf("%d\n",a[i});

    fun(a,m);

    for(i=0;i<m;i++)

    printf("%d"a[i]);

    }


    正确答案:void fun(int a[]int n) { int ijtp; for(j=0;jn-1;j++) { p=j; for(i=j;in;i++) if(a[i]>a[p]) p=i; t=a[p]; a[P]=a[j]; a[j]=t; } }
    void fun(int a[],int n) { int i,j,t,p; for(j=0;jn-1;j++) { p=j; for(i=j;in;i++) if(a[i]>a[p]) p=i; t=a[p]; a[P]=a[j]; a[j]=t; } } 解析:程序的基本思路是依次用当前取得的元素和它后面的其他元素进行比较,这样在比较完后,可以保证当前位置的当前元素存放着最大数。按同样方法取得次最大数。空白1处填j++,循环变量j依次增1,取出每个数;空白2处填>,按照题目要求是从大到小排序:空白3处填j,借助中间变量交换两个数。

  • 第22题:

    有以下程序: fun(char p[][10]) { int n=0,i; for(i=0;i<7;i++) if(P[i][0]=='T')n++; return n; } main() {char str[][10]={"Mon","Tue","wed","Thu","Fri","Sat","Sun"}; printf("%d\n",fun(str)); } 程序执行后的输出结果是( )。

    A.1

    B.2

    C.3

    D.0


    正确答案:B
    解析:fun()函数实现的功能为查找二维字符数组第一列中为字符T的个数。二维数组的地址作为函数的实参。

  • 第23题:

    若有以下程序 include int a[ ]={2,4,6,8}; main( ) { int i; int *p=a; for(i=0;i<4

    若有以下程序

    #include <stdio.h>

    int a[ ]={2,4,6,8};

    main( )

    { int i;

    int *p=a;

    for(i=0;i<4;i++) a[i]=*p;

    printf("%d\n",a[2]);}

    上面程序的输出结果是

    A.6

    B.8

    C.4

    D.2


    正确答案:D
    解析:在C语言中,数组元素下标是从0开始的;指针变量p指向数组的首地址。for循环语句中,指针变量 p始终指向数组的首地址,因而执行循环赋值语句后数组各元素的值均变为2。