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; /给整型数数组指针变量赋值/
————————————————————————————————————
- 数组初始化:
即定义时即赋值:
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循环改变数组的每一个元素。
- 数组的赋值:
在定义过后,需要给数组每一个元素赋值时,不能再像初始化那样:
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;
}