1.若有以下定义和语句,则输出结果是:
int **pp,*p,a=10,b=20;
pp=&p;p=&a;p=&b; //最后p去了b的地址,pp跟着去了b的地址。
cout<<*p<< “,”<<**pp;
D 【正确答案: D】
A 10,20
B 10,10
C 20,10
D 20,20
2.若有定义语句:int s[4][6], t[6][4], (*p)[6];
,则以下正确的赋值语句是:B 【正确答案: B】
A p=t;
B p=s; //p是一个指向列数为6的数组的指针。
C p=s[2];
D p=t[3];
3.若有以下定义和语句,则对m数组元素地址的正确引用是:
int m[2][3], (*p)[3];
p=m;
A 【正确答案: B】
A p[2]
B p[0]+1 //第一行第二个元素。
C *(p+2)
D (p+1)+2
4.若有定义:int (*p)[3];
,则以下叙述正确的是:
C【正确答案: C】
A p是一个指针数组名
B p是一个指针,它可以指向一个一维数组中的任意元素
C p是一个指针,它可以指向一个含有3个整型元素的一维数组 //列数为三的数组。
D (p)[3]等价于p[3]
5.语句int (*ptr)();的含义是: C【正确答案: C】
A ptr是指向一维数组的指针变量
B ptr是指向int型数据的指针变量
C ptr是指向函数的指针,该函数返回一个int型数据
D ptr是一个函数名,该函数的返回值是指向int型数据的指针
6.设用以下程序段建立了sp与str的关系,则以下对字符串的引用不正确的是:
char str[4][8]={"str1","str2","str3","str4"}, *sp[4]; //sp[]是一个指针数组。
int n;
for (n=0; n<4; n++)
sp[n]=str[n]; //第n个指针对应数组第n行元素的首地址。不能sp=str;
——————————————————————————————————————————
//str[4][8]={"str1","str2","str3","str4"}
//四行八列,每行前四个是字符,后四个是空。
/*
s+t+r+1+ + + +
s+t+r+2+ + + +
s+t+r+3+ + + +
s+t+r+4+ + + +
*/
___________________________________________
cout<<endl<<endl<<sp; //0x6ffde0 指针数组的第一个元素的地址。
cout<<endl<<endl<<*sp; //str1;
cout<<endl<<endl<<sp[0]; //str1;
cout<<endl<<endl<<*(sp+1); //str1;
//sp[n]存入的是str[4][8]第n行第一个元素的地址,输出sp,从第一个元素开始往后持续输出,直到遇到'\0'结束。
//*sp=sp[0],*(sp+1)=sp[1];
//
——————————————————————————————————————————————
cout<<endl<<endl<<sp; //0x6ffde0
cout<<endl<<endl<<&sp[0]; //0x6ffde0
cout<<endl<<endl<<&sp[1]; //0x6ffdf8;
cout<<endl<<endl<<&sp[2]; //0x6ffe00
cout<<endl<<endl<<&sp[3]; //0x6ffe08
——————————————————————————————————————————————
cout<<endl<<endl<<str; //0x6ffdd0
cout<<endl<<endl<<str[0]; //str1
cout<<endl<<endl<<str[1]; //str2;
cout<<endl<<endl<<str[2]; //str3
cout<<endl<<endl<<str[3]; //str4
A【正确答案: A】
A sp
B *sp
C sp[0]
D *(sp+1)
以下程序段的运行结果是:
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]; //第n个指针对应数组第n行元素的首地址
cout<<*p[1]<<','<< (*p)[1]<<','<< p[3][2]<<','<< *(p[3]+1);
//*p[1] 取第2个指针指向的元素的值。即指向第二行元素的首元素。a[1][0]. 4
//(*p)[1] 取指针p指向的元素,再输出里面第一个元素。即指向第一行元素。a[0][1].2
//p[3][2] 就是a[3][2] .12
//*(p[3]+1) 就是a[3][1] .11
C【正确答案: C】
A 4, 4, 9, 8
B 程序出错
C 4, 2,12,11
D 1, 1, 7, 5
8.若有定义:int *p[4];
则标识符p:B【正确答案: B】
A 是一个指向整型变量的指针
B 是一个指针数组名
C 是一个指针,它指向一个含有四个整型元素的一维数组
D 定义不合法
9.下面程序的运行结果是:
int a[3][4] = { { 1, 3, 5, 7 }, { 9, 11, 13, 15 }, { 17, 19, 21, 23 } };
int (*q)[4] = a, i, j, n = 0; //q是指针数组。
for (i = 0; i < 3; i++)
for (j = 0; j < 2; j++)
n = n + *(*(q + 1) + j); //n=0+(a[1][0]+a[1][1])*3=20*3=60.
cout << n << endl;
C【正确答案: C】
A 68
B 72
C 60
D 144
10.下面程序的运行结果是:
void fun(int* *a, int p[2][3]) {
**a = p[1][1]; //可以改变*p的值。
}
int main() {
int a[2][3]={{2,4,6},{8,10,12}};
int *p;
p = new int; //给p分配一块新空间
fun(&p, a); //指针的地址,对应指针的指针。
cout << *p; //10.
return 0;
}
D【正确答案: D】
A 2
B 6
C 8
D 10
1.读程序,写结果: 8 【 正确答案: 8】
#include <iostream>
using namespace std;
int main() {
int a[] = { 1, 3, 5, 7 };
int *p[3] = { a + 2, a + 1, a }; //p是一个指针数组,&a[2],&a[1],&a[0]
int* *q = p; //q是指针的指针,q指向p,q=&p.
cout << *(p[0] + 1) + **(q + 2); //*(&a[2]+1)+**(&p[2])=*(&a[3])+*(&a[0])= a[3]+a[0]=7+1=8
return 0;
}
2, 读程序,写结果: worker apple 【 正确答案: worker apple】
#include <iostream>
#include <cstring>
using namespace std;
void fun(char (*a)[20], int n, char* &p1, char* &p2) { //a 是一个指针,指向列数为20的数组。&p1,&p2是字符型指针的引用。因为要改变指针的指向,所以必须要用引用去到指针的指针进行改变,否则函数运行结束后最后的结果是完全没变化。
p1 = p2 = a[0]; //第一行元素的首地址。
for (int i = 0; i < 5; i++) { //共五行。
if (strcmp(a[i], p1) > 0) //第i行元素的首地址。第i行元素组成的字符串。
p1 = a[i]; //p1得到最大字符串所在行数的首地址。 这里是改变了指针的值,而不是改变了指针的指向,所以函数参数里必须是指针的引用,不能是指针,否则没有结果。
if (strcmp(a[i], p2) < 0)
p2 = a[i]; //p2得到最小字符串所在行数的首地址。
}
}
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;
}
//这里的引用改变了p1,p2的值,即改变了指针的指向,
ranqy347的博客。
即指针传递只是传了一个地址copy, 在函数内部改变形参所指向的地址,不能改变原实参指向的地址,仅可以通过修改形参地址的内容,来达到修改实参内容的目的(原C语言中的通过指针来互换值小函数例子),所以如果想通过被调函数来修改原实参的地址或给重新分配一个对象都是不能完成的,只能使用双指针或指针引用。
指针传递只能改变指针指向元素的值,不能改变指针的指向即指针的值。、
要想改变指针的值只有先找到指针的地址即 由指针的指针或指针的引用操作才得以完成。
3.下面fun函数的功能是从n个字符串中找出最长的串,请填空使程序完整。
#include <iostream>
#include <cstring>
using namespace std;
void fun(char (*str)[81], int n, char** sp) {
int i;
*sp = str[0] //【 正确答案: str[0] 或 *str】; str[0]是第一行元素的首地址。
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)】; s是指针,实参&s是指针的地址,形参类型char**是指针的指针,形参sp是形参的地址。
cout<<s<<endl;
return 0;
}
土豆西瓜大芝麻的帖子。
所以依据&后面的变量名是否已经存在,也很容易判断是引用还是取地址符。
4.下列程序的执行结果是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是一个指向函数的指针,该函数的返回值为int型。
p=max // p指向max. 【 正确答案: p=max 或 p=max;】;
cout << p(a, b) << endl;
return 0;
}
5.读程序,写结果: 2468 【 正确答案: 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; //p是一个指针数组
for(i=0; i<4; i++) {
p[i]=&x[2*i+1]; //&x[1],&x[3],&x[5],&x[7],
}
for(i=0;i<4;i++){
cout<<*p[i]; //2468.
}
return 0;
}