0620指针与数组

1.若有定义语句:int x[5]={0, 1, 2, 3, 4}, *p;,则以下数值不为2的表达式是:
B【正确答案: C】
A p=x+1, ++(*p) //p=&x[1],++1=2;
B p=x+2, p++ //p=&x[2],2; 取值运算符和自加运算符优先级相同,有个误区:按照从右到左的运算法则,应该先p自加,之后再取值。但实际上是,取值后p再自加。
C p=x+1, (p++) //p=&x[1],&a[1]=a[1];//先取值,在地址自加。相当于
p.两步同时完成,输出结束后p再自加。
D p=x+1, ++p //&a[2]=a[2]=2;

2.若有定义:int b[5];,则以下对b数组元素的正确引用是:D【正确答案: D】
A *&b[5] //超纲。
B b+2
C ((b+2)) //用于二维数组。
D *(b+2) //用于一维数组。

3.下面程序段的运行结果是:

int a[3][3] = { { 2 }, { 4 }, { 6 } }; //200 400 600.
 int k, *q = &a[0][0];
 for (k = 0; k < 2; k++) {
  if (k == 0)
   a[k][k + 1] = *q + 1;// a[0][1]=2+1=3;
  else
   ++q;  
  cout << *q;          //第一个循环,输出2.第一个循环,输出3.
 }

B【正确答案: B】
A 26
B 23
C 36
D 33

4.若有定义:int x[5], *p=x;,则不能代表x数组首地址的是:
C
【正确答案: C】
A x
B &x[0]
C &x //no
D p

5.若有定义:int c[5], *p=c;,则以下对c数组元素地址的正确引用是:D【正确答案: D】
A p+5 //超纲。
B c++ //p++可以,c是数组首元素的地址,自加没意义
C &c+1 //没意义。
D &c[0]

6.若有定义语句:int s[4][6], t[6][4], (*p)[6];,则以下正确的赋值语句是:B【正确答案: B】
A p=t;
B p=s;
C p=s[2];
D p=t[3];

7.若有以下定义和语句,则对m数组元素地址的正确引用是:

int m[2][3], (*p)[3];
p=m;

D【正确答案: B】
A p[2]
B p[0]+1
C (p+2)
D (p+1)+2 //
(p+1)+2

8.若有定义:int (*p)[3];,则以下叙述正确的是:C 【正确答案: C】
A p是一个指针数组名
B p是一个指针,它可以指向一个一维数组中的任意元素
C p是一个指针,它可以指向一个含有3个整型元素的一维数组
D (p)[3]等价于p[3]

9.若有定义:int i, x[3][4];,则不能将x[1][1]的值赋给变量i的语句是:
D
【正确答案: B】
A i=x[1][1]
B i=((x+1)) //((x+1)+1)
C i=((x+1)+1)
D i=*(x[1]+1)

10.执行以下程序段后,m的值是:

int a[2][3]={{1, 2, 3}, {4, 5, 6}}int m, *ptr;
ptr=&a[0][0]//ptr取的是第一个元素的地址,不是第一行元素的首地址。
m=(*ptr)*(*ptr+2)*(*ptr+4)//m=1*3*5=15;

D
【正确答案: A】
A 15
B 48
C 24
D 无定值

11.若有定义:int x[10], *p=x;,则*(p+5)表示:B【正确答案: B】
A 数组元素x[5]的地址
B 数组元素x[5]的值
C 数组元素x[6]的地址
D 数组元素x[6]的值

12.以下能正确进行字符串赋值操作的是:D【正确答案: D】
A char s[5]={“ABCDE”}; // 太长了,字符串最多四个,五个不行。//mfrbuaa博客上说"该代码不会引起编译错误,但因为改写了数组空间以外的内存单元,所以是危急的"
B char s[5]={‘A’, ‘B’, ‘C’, ‘D’, ‘E’};.//五个可以,六个不行。 //mfrbuaa博客说“这里不要忘记为最后的,’/0’分配空间。”
好吧,暂时都当AB错的。
C char *s; *s=“ABCDE”; //s=“ABCDE” 把字符串的首地址给指针变量。
D char *s=“ABCDE”; //可以。
————————————————————————
//春花秋月灬相伴的博客。
char a[10];
怎么给这个数组赋值呢?
1、定义的时候直接用字符串赋值
char a[10]=”hello”;
注意:不能先定义再给它赋值,如char a[10]; a[10]=”hello”;这样是错误的!
2、对数组中字符逐个赋值
char a[10]={‘h’,’e’,’l’,’l’,’o’};
3、利用strcpy
char a[10]; strcpy(a, “hello”);
————————————————————
// mfrbuaa的博客。
char chArray[5]={’/t’,’/t’,’/t’,’/t’,’/0’);
  这里不要忘记为最后的,’/0’分配空间。假设要初始化一个字符串"hello",那为它定义的数组至少有6个数组元素。
  比如,以下的代码给数组初始化,但会引起不可预料的错误:
    char array[5]=“hello”;
  该代码不会引起编译错误,但因为改写了数组空间以外的内存单元,所以是危急的。
————————————————————————————————
补充:

无论是静态,局部还是全局数组只有在定义时才能初始话,否则必须通过其它方法,比如循环操作实现。

任何
int a[3];
static int b[3];
a[3] = {1, 2, 3};
b[3] = {1, 2, 3};
没有在定义时初始化都是错误的!
——————————————————————————————————————
指针数组赋值

例如:
main()
{
char *f[2];
int *a[2];
f[0]=”thank you”; /给字符型数组指针变量赋值/
f[1]=”Good Morning”;
*a[0]=1, *a[1]=-11; /给整型数数组指针变量赋值/

————————————————————————————————————

  1. 数组初始化:

即定义时即赋值:

int a[4]={0}; //每一个位置的int都为0

int b[4]={1}; //只有第一个元素为1,其他都为0

所以要想把数组初始化为其他值,则需要一个个的指定值: int b[4]={1,2,3,4};//比如指定为1,2,3,4

或者先统一初始化为0,再利用for循环改变数组的每一个元素。

  1. 数组的赋值:

在定义过后,需要给数组每一个元素赋值时,不能再像初始化那样:

         a[4] = {1,3,5,7}; //这是错误的,

         a={1,3,5,7};//这还是错的。

只能利用for循环,或者利用memcpy从其他内存拷贝一份值过来。

13.若已定义:int a[9],*p=a;并在以后的语句中未改变p的值,则不能表示a[1]地址的表达式是:
D【正确答案: C】
A p+1 //&a[1]
B a+1 //&a[1]
C a++
D ++p //&a[1]

指针可以自加,因为他是int* 型变量,自加单位就是指针(便于理解的乱说)。地址可以加一不能自加。不具备自加单位。(便于理解的乱说)-_-!
14.下面程序段的运行结果是:

char *s="abcde"//s取到字符串首元素的地址。
s+=1//s取到字符串第二个元素的地址。
cout<<s;

B【正确答案: A】
A bcde
B 字符’b’的地址
C 字符’c’的地址
D 字符’b’的ASCII值

15.若有以下语句段,则对x数组元素引用不正确的是:

int x[]={1,2,3,4,5,6},*ptr;
ptr=x;

A【正确答案: A】
A *(–ptr) //先自减,再取值。
B *(ptr–) //先取值,再自减。
C *(ptr++)//先取值,再自加。
D *(++ptr) //先自加,再取值。

16.以下程序段的运行结果是:

char a[]="program", *p;
char ch;
p=a;
while (*p!='g'){
 ch=*p-32; //小写变大写。
 cout<<ch;
 p++;
}

C 【正确答案: C】
A PROgram
B PROGRAM
C PRO
D proGRAM

17.下面程序段的运行结果是:

char str[]="xyz", *p=str;
cout<<*(p+2);

D【正确答案: D】
A 字符’z’的地址
B 0
C 字符’z’的ASCII码
D 字符’z’

18.若有定义:int a[2][3];,则以下对a数组元素地址的正确表示为:A【正确答案: A】
A (a+1) //第二行元素首地址。(*(a+1)+1) 元素。
B *(a[1]+2) //a[1][2]
C a[1]+3 //超纲。
D a[0][0] //元素。

19.若有说明语句:int a[2][3], m, n; 且0≤m≤1,0≤n≤2,则以下对数组元素的正确引用形式是:
D 【正确答案: D】
A a[m]+n
B (a+m)[n] //(a+m)[n]
C (a+m)+n //(
(a+m)+n)
D ((a+m)+m)

20.以下程序段的运行结果是:

int a[4][3]={ 1, 2, 3      , 4, 5, 6     , 7, 8, 9    ,10,11,12};
 int *p[4], j;  //p是指针数组。
 for (j=0; j<4; j++) 
 p[j]=a[j]; //数组每行首元素的地址。
 cout<<*p[1]<<','<< (*p)[1]<<','<< p[3][2]<<','<< *(p[3]+1); //a[1][0],a[0][1],a[3][2],a[3][1]   4,2,12,11

B【正确答案: C】
A 4, 4, 9, 8
B 程序出错
C 4, 2,12,11
D 1, 1, 7, 5

21.若有定义:int *p[4];则标识符p:B【正确答案: B】
A 是一个指向整型变量的指针
B 是一个指针数组名
C 是一个指针,它指向一个含有四个整型元素的一维数组
D 定义不合法

22.下面程序的运行结果是:

int a[3][4] = { { 1, 3, 5, 7 }, { 9, 11, 13, 15 }, { 17, 19, 21, 23 } };
 int (*q)[4] = a, i, j, n = 0;
 for (i = 0; i < 3; i++)
  for (j = 0; j < 2; j++)
   n = n + *(*(q + 1) + j); //1.n=a[1][0]+a[1][1]=9+11=20.2.n=20+20=40.3.n=60.
 cout << n << endl;

C
【正确答案: C】
A 68
B 72
C 60
D 144

23.下面程序的运行结果是:

void fun(int **a, int p[2][3]) {
 **a = p[1][1];
}
int main() {
 int a[2][3]={{2,4,6},{8,10,12}};
 int *p;
 p = new int;
 fun(&p, a);
 cout << *p;
 return 0;
}

C
【正确答案: D】
A 2
B 6
C 8
D 10

24.设用以下程序段建立了sp与str的关系,则以下对字符串的引用不正确的是:

char str[4][8]={"str1","str2","str3","str4"}, *sp[4];
int n;
for (n=0; n<4; n++)
sp[n]=str[n];

【正确答案: A】
A sp
B sp //(sp+0)
C sp[0] //有方括号就是有值啦。
D *(sp+1)

25.以下程序段的输出结果是:

char a[] = "Program", *ptr;
for (ptr = a; ptr < a + 7; ptr += 2)
 putchar(*ptr);  //putchar()输出一个字符,如果是cout<<,则会一直输出,直到遇到'\0'为止。

B【正确答案: B】
A Program
B Porm
C 有语法错
D Por

26.以下程序段的运行结果是:

char b[]=”Basic”,*p;
for (p=b;p<b+5;p++)
  cout<<p<<endl;

A【正确答案: A】
A Basic
asic
sic
ic
c
B B
a
s
i
c
C C
Ic
sic
asic
Basic
D Basic

27.下列程序的运行结果是:

void f(float *q1, float *q2, float *a) { //形参类型是float类型的指针,不是指针的指针或指针的引用,只能改变指针指向的元素的值,不能改变指针的指向,实参s还是指向a,*s的值还是1.1.
 a = new float;
 *a = *q1 + *(q2++); 
}
int main() {
 float a[2] = { 1.1, 2.2 }, b[2] = { 10.0, 20.0 }, *s = a;
 f(a, b, s);
 cout << *s << endl;
 return 0;
}

A【正确答案: A】
A 1.1
B 11.1
C 12.1
D 21.1

28.下面程序段的运行结果是:

int b[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
 int *q = b;
 cout << *(q + 2) << endl;

C【正确答案: C】
A 1
B 2
C 3
D 4

29.语句int (*ptr)();的含义是:
C【正确答案: C】
A ptr是指向一维数组的指针变量
B ptr是指向int型数据的指针变量
C ptr是指向函数的指针,该函数返回一个int型数据
D ptr是一个函数名,该函数的返回值是指向int型数据的指针

30.若有以下定义和语句,则输出结果是:

int **pp,*p,a=10,b=20;
pp=&p;p=&a;p=&b;
cout<<*p<<,<<**pp;

D【正确答案: D】
A 10,20
B 10,10
C 20,10
D 20,20

1.若1有int a[] = {5, 15, 34, 54, 14, 2, 52, 72};int *p = &a[5];则p[2]的值是 72 【 正确答案: 72】,p[-2]的值是 54 【 正确答案: 54】 。
p[0]=a[5]=2; p[2]=a[7]=72; p[-2]=a[3]=54.;

2.已知int a[5]={1,2,3,4,5},*p=a,b;分别回答下列问题:

①执行b=*p++后,b= 2 【 正确答案: 1】//先取值,后自加。a[0]=1.
a[0]= 1 【 正确答案: 1】
*p= 1 【 正确答案: 2】//p已自加,a[1].

②执行b=(*p)++后,b= 1 【 正确答案: 1】//先取值,值后自加。a[0]=1.
a[0]= 2 【 正确答案: 2】//值已自加
*p= 2 【 正确答案: 2】。//p指向a[0].

③执行b=*++p后,b= 2 【 正确答案: 2】//先自加,后取值a[1].
a[0]= 1 【 正确答案: 1】
*p= 2 【 正确答案: 2】p指向a[1].

3.读程序,写结果: 1357 【 正确答案: 2468】

#include <iostream>

using namespace std;

int main() {

    int x[]= {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16},*p[4],i;

    for(i=0; i<4; i++) {

        p[i]=&x[2*i+1]; //1,3,5,7.

    }

    for(i=0;i<4;i++){

        cout<<*p[i];//2468

    }

    return 0;

}

4.以下程序求a数组中的所有素数的和,函数isprime用来判断自变量是否为素数。

#include <iostream>

using namespace std;

bool isprime(int x) {

    int i;

    if(x<=1)

        return false;

    for (i = 2; i <= x / 2; i++)

        if (x % i == 0)

            return false;

         return true;     // 【 正确答案: return true;】

}

int main() {

    int i, a[10], *p = a, sum = 0;

    cout << "Enter 10 num:";

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

        cin >> a[i];

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

        if (isprime(*(p +     i      //【 正确答案: i】 ))) 
        {

            sum +=      *(p+i);     // 【 正确答案: *(a + i) 或 a[i] 或 *(p+i) 或 p[i]】;

        }

    cout << "\nThe sum=" << sum << endl;

    return 0;

}

5.读程序,写结果: 4 16 28 【 正确答案: 4 16 28】

#include <iostream>

using namespace std;

int main() {

    int a[8] = { 4, 8, 12, 16, 20, 24, 28, 32 };

    int *p = a;

    do {

        cout << *p << ' '; //0,3,6  //4 16 28

        p += 3;

    } while (p < a + 8);

    return 0;

}

6.下列程序的执行结果是5,请填空补充完整。

#include <iostream>

using namespace std;

int max(int a, int b) {

    return a > b ? a : b;

}

int min(int a, int b) {

    return a < b ? a : b;

}

int main() {

    int a = 3, b = 5;

    int (*p)(int, int);

   ///   _______        【 正确答案: p=max 或 p=max;】;

    cout << p(a, b) << endl;

    return 0;

}

7.读程序,写结果: abcdefg ADGH 【 正确答案: abcdefg ADGH】

#include <iostream>

using namespace std;

int main() {

    char a[80], b[80], c[] = "aAbcdDefgGH";

    char *p = c;

    int i = 0, j = 0;

    while (*p != '\0') {

        if (*p >= 'a' && *p <= 'z') {

            a[i] = *p;   //abcdefg

            i++;

        } else {

            b[j] = *p;//ADGH

            j++;

        }

        p++;

    }

    a[i] = b[j] = '\0';

    cout<<a<<" "<<b;

    return 0;

}

8.读程序,写结果: 10 【 正确答案: 10】

#include <iostream>

using namespace std;

int main() {

	char a[20] = "here is", b[20] = "key";
    //char a[20] = "here is3333333", b[20] = "key";          (*1).

    char *s1 = a, *s2 = b;
    cout<<s1<<endl<<endl;  //here is
    cout<<s2<<endl<<endl; //key  
    //______________________________________  (*1)改变了a的大小,下面四个还是不变。 
    cout<<s2-s1<<endl;    //-32;   4*8=32.四个指针单位。 
	cout<<s1-s2<<endl;    //32;
	cout<<sizeof(s1)<<endl;  //8  一个指针单位八个字节。 
	cout<<sizeof(s2)<<endl;  //8
	//______________________________________ 
	cout<<sizeof(a)<<endl;  //20     //内存,不是长度。 
	cout<<sizeof(b)<<endl;  //20
    while (*s1 != '\0')

        s1++; //指针s1移动到字符串末尾'\0'的位置。 
       cout<<s1<<endl<<endl; //什么都没有。s1指向字符串末尾的'\0'. 

    while ((*s1++ = *s2++)); //是赋值号不是等于号。 改变了指针指向的元素(字符串a)的值。 
    //while后直接接“;",当字符串b的字符一个一个复制完后循环结束。
	//s1指向字符串a的"here iskey "末尾的'\0'.
    //s2指向字符串b的"key"末尾的'\0'.

    s1 = s2 = a;    // s1,s2指向字符串a的"here iskey "首元素.
     cout<<a<<endl<<endl;  //here iskey 
    cout<<s1<<endl<<endl;  //here iskey  
    cout<<s2<<endl<<endl; //here iskey  
	cout<<s2-s1;          //0. 
    while (*s2 != '\0')

        s2++;              //指针s2移动到字符串末尾'\0'的位置。   
    cout<<s2<<endl<<endl; //什么都没有。s2指向字符串末尾的'\0'. 
	cout<<s1<<endl<<endl; //here iskey  
    cout << s2 - s1;  //s1指向字符串首元素,s2指向字符串a 末尾的'\0',他们相减等于字符串的长度,11-1=10.
	//他们指向同一个字符串,而不是两个不同的字符串, 所以不是用指针单位。 

    return 0;
}

9.读程序,写结果: EDCBA E DE CDE BCDE ABCDE 【 正确答案: EDCBA E DE CDE BCDE ABCDE】


#include <iostream>

#include <cstring>

using namespace std;

int main() {

    char *p;

    int i;

    p = new char[20];

    strcpy(p, "ABCDE");

    for (i = 4; i >= 0; i--)

        cout << *(p + i); //EDCBA 

    cout<<" ";

    for (i = 4; i >= 0; i--)

        cout << p + i << " ";//字符串首地址。 E DE CDE BCDE ABCDE

    delete[] p;

    return 0;

}

10.读程序,写结果: 1 2 3 4 0 9 8 7 6 5 【 正确答案: 1234098765】


#include <iostream>

using namespace std;

void fun(int *s,int nl,int n2) {

    int i,j,t;

    i=nl;

    j=n2;

    while(i<j) {

        t=s[i];

        s[i]=s[j];

        s[j]=t;

        i++;

        j--;

    }

}

int main() {

    int a[10]= {1,2,3,4,5,6,7,8,9,0},k;

    fun(a,4,9);

    for(k=0; k<10; k++)

        cout<<a[k]<<" "; //1,2,3,4,0,9,8,7,6,5

    return 0;

}

11.读程序,写结果: 【 正确答案: 8】

#include <iostream>

using namespace std;

int main() {

    int a[] = { 1, 3, 5, 7 };

    int *p[3] = { a + 2, a + 1, a }; //指针数组

    int **q = p;

    cout << *(p[0] + 1) + **(q + 2); //*(a+3)+*a=7+1=8;

    return 0;

}

12.下面程序的功能是将八进制正整数组成的字符串转换为十进制整数,请填空补充完整。

#include <iostream>

using namespace std;

#include <stdio.h>

int main() {

    char *p, s[10];

    int n;

    p = s;

    gets(p);

    n=0;

    while ( //_______________【 正确答案: *p!= '\0' 或 *p】) 
    {

        n = n * 8 + *p - '0';//- '0'将字符转换为数字。

      // __________           【 正确答案: p++; 或 p++ 或 ++p 或 ++p; 或 p=p+1; 或 p=p+1】;

    }

    cout<<n<<endl;

    return 0;

}

13.读程序,写结果: apple worker 【 正确答案: worker apple】

#include <iostream>

#include <cstring>

using namespace std;

void fun(char (*a)[20], int n, char *&p1, char *&p2) {

    p1 = p2 = a[0];

    for (int i = 0; i < 5; i++) {

        if (strcmp(a[i], p1) > 0)

            p1 = a[i];

        if (strcmp(a[i], p2) < 0)

            p2 = a[i];

    }

}

int main() {

    char a[5][20] = { "student", "worker", "cadre", "apple", "peasant" };

    char *p1, *p2;

    fun(a,5,p1,p2);

    cout << p1 << ' ' << p2 << endl; //靠后的大,靠前的小。

    return 0;

}

14.下面fun函数的功能是从n个字符串中找出最长的串,请填空使程序完整。

#include <iostream>

#include <cstring>

using namespace std;

void fun(char (*str)[81], int n, char **sp) {//指针的指针。

    int i;

    *sp =     // str      【 正确答案: str[0] 或 *str】;

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

        if (strlen(*sp)< strlen(str[i]))

               //  *sp=str[i]      【 正确答案: *sp=str[i] 或 *sp=*(str+i)】;

}

int main() {

    char str[5][81]= {"he","hello","hi","heave","have"};

    char *s;

        // fun(str,5,s)      【 正确答案: fun(str,5,&s)】;指针的地址。

    cout<<s<<endl;

    return 0;

}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值