沈阳师范大学C++ pta第三章 指针引用
判断题
1.字符串常量实质上是一个指向该字符串首字符的指针常量。 — — — T
2.定义一个指针数组并初始化赋值若干个字符串常量,则指针数组并不存放这些字符串,而仅仅指向各个字符串。 — — — T
3.指向整数指针的指针与指向整数数组的指针可以看成是等价的类型。 — — — F
4.定义指针函数变量后,将一个函数名赋值该指针变量,要求函数的参数个数、类型一致。 — — — T
5.对于定义int a[10],*p=a; 语句p=a+1;和a=a+1;都是合法的。— — — F
6.执行语句int *p; 后,指针变量p只能指向int类型的变量。— — — T
7.int (*p)[4]它表示p是一个指针数组,它包含4个指针变量元素。— — — F
8.若有定义char* p=“computer”;则表示p的值是字符串" computer "。— — — F
9.如果函数的返回类型是指针,则可以返回函数内部任意变量的地址。— — — F
10.语句 int *p[5]; 定义了一个指针数组p,用于指向一个有5个元素的数组。 — — — F
11.指向结构体变量的指针可以作函数参数,实现传址调用。。 — — — T
12.调用printf函数,%s的格式输出字符串时,字符数组名、字符指针和字符串常量都可以作为输出参数。 — — — T
13.语句int *p, q, r; 定义了3个指针变量。— — — F
14.两个任意类型的指针可以使用关系运算符比较大小。— — — F
15.可以用一个指针变量指向一个函数,然后通过该指针变量调用此函数。— — — T
16.char *s=“C Language”;表示s是一个指向字符串的指针变量,把字符串的首地址赋予s。— — — T
17.int i; int &ri=i;对于这条语句,ri和i这两个变量代表的是同一个存储空间。— — —T
18.指针数组的每个元素都是一个指针变量。— — — T
19.不同类型的指针变量是可以直接相互赋值的。— — — F
20.只要将多个指针作为函数的参数,函数就一定会返回多个值。— — — F
21.调用strcmp函数比较字符串大小时,通常较长的字符串会较大。— — —F
22.字符串常量在内存中的存放位置由系统自动安排。— — — T
单选题
设void f1(int * m,long & n);int a;long b;则以下调用合法的是()。
A.f1(&a,&b);
B.f1(a,b);
C.f1(&a,b);
D.f1(a,&b);
下列语句定义 x 为指向 int 类型变量 a 的指针,正确的是()。
A.int a, *x = a;
B.int a, x = a;
C.int *x = &a, a;
D.int a, *x = &a;
下列程序片段哪一个是正确的。
A.int m=8; int &r1=m; const int r2=r1;
B.int m=5; const int &r=m; r=16;
C.int m=8; const int &r1=m; int &r2=r1 ;
D.int m=4; int &r=m*6;
对于int *pa[5];的描述,以下哪个选项是正确的
A.pa是一个具有五个元素的指针数组,每个元素都是一个int类型的指针
B.pa是一个指向某个数组中第五个元素的指针,该元素是int类型的变量
C.pa是一个指向数组的指针,所指向的数组是五个int类型的指针
D.pa[5]表示某个数的第五个元素的值
若p1、p2都是整型指针,p1已经指向变量x,要使p2也指向x, ____是正确的。
A.p2=&p1
B.p2=**p1
C.p2=*p1
D.p2=p1
下列关于引用的说法,错误的是____。
A.引用初始化后,可以通过更变来引用其他变量
B.数组不能定义引用
C.引用在定义时必须初始化
D.引用在初始化时不能绑定常量值
下列哪一个说法是不正确的?
A.const T 类型的常变量和const T & 类型的常引用,也可以用来初始化T & 类型的引用
B.T & 类型的引用或T类型的变量,可以用来初始化const T &类型的引用
C.定义引用时,前面加const关键字,即为"常引用"
D.不能通过常引用去修改其引用的内容
以下不正确的赋值或赋初值的方式是( )。
A.char str[]=“string”;
B.char str[10];str="string";
C.char str[7]={‘s’, ‘t’, ‘r’, ‘i’, ‘n’, ‘g’, ’\0’};
D.char str[7]={‘s’, ‘t’, ‘r’, ‘i’, ‘n’, ‘g’};
下面程序段:
int main() {
int intone;
int &rsomeref = intone;
intone = 5;
cout<<intone<<" “<<rsomeref;
rsomeref = 7;
cout<<intone<<” "<<rsomeref;
return 0; }
输出结果为( )。
A.55 77
B.5 5 7 7
C.5 57 7
D.5577
以下哪个定义中的p不是指针,请选择恰当的选项:
A.char (*p)[10];
B.char **p;
C.char *p[6];
D.给出的三项中,p都是指针
下面程序段 int a=1,b=2; int &r=a; r=b; r=7; cout<<a<<endl; 的输出结果是?
A.1
B.无法确定
C.2
D.7
设变量定义为 int a[2]={1,3}, p=&a[0]+1;,则p的值是( )。
A.&a[0]+1
B.3
C.2
D.4
下面程序片段,哪一个是正确的?
A.int n=8; int &p=n; const int q=p ;
B.int m=5; const int &r=m; r=6;
C.int n=4; int &r=n*3;
D.int n=8; const int &p=n; int &q=p ;
若定义pf为指向float类型变量f的指针,下列语句中__是正确的。
A.float f, *pf = &f;
B.float f, *pf =0.0;
C.float *pf = &f, f;
D.float f, *pf = f;
若变量已正确定义并且指针p已经指向某个变量x,则(*p)++相当于____。
A.x++
B.p++
C.*(p++)
D.&x++
已知:float b = 34.5; ,则下列表示引用的方法中,正确的是( )。
A.float &z;
B.float &y = 34.5;
C.int &t = &b;
D.float &x = b;
关于指针和引用,下面哪个说法是错误的()。
A.通过访问符*来访问指针所指存储空间中的值。
B.指针和引用对它们所指的或所引用的变量的操作方式不一样。
C.和指针类似,引用被初始化后,还可以引用别的变量。
D.引用较高级地封装了指针的特性,它不直接操作内存地址,而是通过访问变量别名来间接操作变量的。
对于如下说明,语法和语义都正确的赋值是_____。
int c, *s, a[]={1, 3, 5};
A.c=a;
B.c=*s;
C.s[0]=a[0];
D.s=&a[1];
已知:int a(5),&ra=a;下列描述中,错误的是( )。
A.ra是变量a的引用,即为变量的别名
B.ra的值为5
C.ra的地址值为&a
D.改变ra的值为10,变量a值仍为5
根据声明int a[10], *p=a; ,下列表达式错误的是( )。
A.*p++
B.a[9]
C.a++
D.p[5]
在基类型相同的两个指针变量之间,不能进行的运算是( )。
A.+
B.<
C.–
D.=
下列对变量的引用中错误的是____。
A.float a; float &p = a;
B.int a; int &p; p=a;
C.char a; char &p = a;
D.int a; int &p = a;
若已定义: int a[9], *p=a;并在以后的语句中未改变 p 的值,不能表示 a[1] 地址的表达式是( )。
A.a++
B.p+1
C.a+1
D.++p
对于定义 char str[] = “abc\000def\n”(注:其中0为数字零),求字符串str的长度len和数组str的大小size,len和size分别是:
A.3 ,4
B.3 ,11
C.12 ,13
D.3 ,9
( )是给变量取一个别名,引入了变量的同义词。
A.引用
B.结构
C.指针
D.枚举
根据声明int (*p)[10], p是一个( )。
A.数组
B.数组的元素
C.函数
D.指针
下列哪一个说法是不正确的?
A.引用可以引用变量,也可以引用常量和表达式
B.定义引用时一定要将其初始化成引用某个变量
C.初始化后,它就一直引用该变量不会再别引用别的变量了
D.某个变量的引用等价于这个变量,相当于该变量的一个别名
填空题
write the output of the code below.
#include <iostream>
using namespace std;
int& f(int &i )
{
i += 10;
return i ;
}
int main()
{
int k = 0;
int& m = f(k);
cout << k << "#";
f(m)++;
cout << k << endl;
return 0;
}
10#21
编程题
R7-1 实数排序
本题要求编写程序,输入n个实数,使用指针引用的方式将它们按从大到小的顺序排列。
输入格式:
输入第一行给出一个正整数n(2≤n≤10),输入第二行给出n个实数,其间以空格分隔。
输出格式:
输出从大到小排好序的n个数(保留2位小数),每个数之间空一格,行末没有空格。
输入样例:
在这里给出一组输入。例如:
5
3.2 5.4 6.12 2.51 4.23
输出样例:
在这里给出相应的输出。例如:
6.12 5.40 4.23 3.20 2.51
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
void put(float *a,int n)
{
int i,j;
float t;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(*(a+i)>*(a+j))
{
t=*(a+i);
*(a+i)=*(a+j);
*(a+j)=t;
}
}
}
}
void out(float *a,int n)
{
int i=1;
printf("%.2f",*(a+i-1));
for(;i<n;i++)
{
printf(" %.2f",*(a+i));
}
}
int main(int argc, char const *argv[])
{
int n,i;
cin>>n;
float a[n];
for(i=0;i<n;i++)
cin>>a[i];
put(a,n);
out(a,n);
}
R7-2 组织星期信息
输入一个正整数repeat (0<repeat<10),做repeat次下列运算:
定义一个指针数组将下面的星期信息组织起来,输入一个字符串,在表中查找,若存在,输出该字符串在表中的序号,否则输出-1。
Sunday Monday Tuesday Wednesday Thursday Friday Saturday
输入输出示例:括号内为说明,无需输入输出
输入样例 (repeat=3):
3
Tuesday
Wednesday
year
输出样例:
3
4
-1
#include <iostream>
#include <string.h>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main() {
char week[7][15] = { "Sunday", "Monday",
"Tuesday","Wednesday",
"Thursday", "Friday",
"Saturday"
}; //开个二维数组制表
int i, n, j;
char s[15];
scanf("%d ", &n); //注意点:此处%d后有个空格后者是\n,吃掉回车,防止影响gets
for (i = 0; i < n; i++) {
cin>>s;
for (j = 0; j < 7; j++)
if (!strcmp(s, week[j])) { //如果返回值为0,则说明两个串相等
printf("%d\n", j + 1); //因为数组下标从0开始,所以要加1
break;
}
if (j == 7) //如果j == 7,则说明没找到相等的,输出-1
printf("-1\n");
}
}
R7-3 冒泡
鸿鸿哥最近学习了指针,感觉这个知识点有点难以理解,于是想要通过编程实践来掌握它。鸿鸿哥以前学习数组(第7章)的时候已经掌握了冒泡排序的一般写法,现在他想用指针来实现排序的功能函数。但是他遇到了困难,你能帮帮他吗?
指针实现冒泡排序函数,函数名统一用void bubbleSort(int *p,int c)。
具体方法自己实现。
输入格式:
输入第一行给出一个正整数n(2≤n≤10),输入第二行给出n个实数,其间以空格分隔。
输出格式:
输出从大到小排好序的n个数(保留2位小数),每个数之间空一格,行末没有空格。
输入样例:
在这里给出一组输入。例如:
5
503 87 512 61 908
输出样例:
在这里给出相应的输出。例如:
61 87 503 512 908
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
//void put(int *a,int n)
void bubbleSort(int *p,int c)
{
int i,j;
float t;
for(i=0;i<c;i++)
{
for(j=0;j<c;j++)
{
if(*(p+i)<*(p+j))
{
t=*(p+i);
*(p+i)=*(p+j);
*(p+j)=t;
}
}
}
}
int main()
{
int c,i;
cin>>c;
int p[c];
for(i=0;i<c;i++)
cin>>p[i];
bubbleSort(p,c);
//out(p,c);
// cout <<*p;
for(int h=0;h<c;h++)
{
cout<<*(p+h)<<" ";
}
}
R7-4 在数组中查找指定元素
输入一个正整数repeat (0<repeat<10),做repeat次下列运算:
输入一个正整数 n (1<n<=10),然后输入n个整数存入数组a中,再输入一个整数x,在数组a中查找x,如果找到则输出相应元素的最小下标,否则输出"Not found"。
要求定义并调用函数search(list, n, x),它的功能是在数组list中查找元素x,若找到则返回相应元素的最小下标,否则返回-1,函数形参 list 的类型是整型指针,形参n和x的类型是int,函数的类型是int。
输出格式语句:printf(“index = %d\n”, );
输入输出示例:括号内为说明,无需输入输出
输入样例:
2 (repeat=2)
3 (n=3)
1 2 -6
2 (x=2)
5 (n=5)
1 2 2 5 4
0 (x=0)
输出样例:
index = 1
Not found
#include <iostream>
#include <string.h>
using namespace std;
#define MAXN 10
int search( int list[], int n, int x );
int main()
{
int i, index, n, x,f;
int a[MAXN];
cin>>f;
for(int j=0;j<f;j++)
{
cin>>n;
for( i = 0; i < n; i++ )
cin>>a[i];
cin>>x;
index=search(a,n,x);
if(index!=-1)
printf("index = %d\n",index);
else
printf("Not found\n");
}
return 0;
}
int search( int list[], int n, int x ){
int i;
for(i=0;i<n;i++)
{
if(x==list[i])
return i;
else
continue;
}
return -1;
}
R7-5 使用函数删除字符串中的字符
输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:
输入一个字符串 str,再输入一个字符 c,将字符串 str 中出现的所有字符 c 删除。
要求定义并调用函数delchar(str,c), 它的功能是将字符串 str 中出现的所有 c 字符删除,函数形参str的类型是字符指针,形参c的类型是char,函数类型是void。
输入输出示例:括号内为说明,无需输入输出
输入样例:
3 (repeat=3)
happy new year (字符串"happy new year")
a (待删除的字符’a’)
bee (字符串"bee")
e (待删除的字符’e’)
111211 (字符串"111211")
1 (待删除的字符’1’)
输出样例:
result: hppy new yer (字符串"happy new year"中的字符’a’都被删除)
result: b (字符串"bee"中的字符’e’都被删除)
result: 2 (字符串"111211"中的字符’1’都被删除)
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
int repeat;
char s[100],ch;
cin>>repeat;
while(repeat--)
{
cin>>s>>ch;
cout<<"result: ";
for(int i=0;i<strlen(s);i++)
if (s[i]!=ch) cout<<s[i];
cout<<endl;
}
return 0;
}
R7-6 使用函数实现字符串复制
输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:
输入一个字符串 t 和一个正整数 m,将字符串 t 中从第 m 个字符开始的全部字符复制到字符串 s 中,再输出字符串 s。
要求定义并调用函数 strmcpy(s,t,m), 它的功能是将字符串 t 中从第 m 个字符开始的全部字符复制到字符串 s 中,函数形参s和t的类型是字符指针,形参m的类型是int,函数类型是void。
输入输出示例:括号内为说明,无需输入输出
输入样例:
3 (repeat=3)
happy new year
7
happy
1
new
4
输出样例:
new year (从"happy new year"第7个字符开始组成的新字符串为"new year")
happy (从"happy"第1个字符开始组成的新字符串为"happy")
error input ("new"的长度小于4)
#include <iostream>
#include <string>
using namespace std;
#define X getchar();
int main(void)
{
string str;
int m, n;
cin >> n; X
for (int i = 0; i < n; ++i)
{
getline(cin, str);
cin >> m; X
if (str.length() < m-1)
cout << "error input" << endl;
else
cout << str.substr(m-1) << endl;
}
return 0;
}
R7-7 找最大的字符串
输入5个字符串,输出其中最大的字符串。
输出格式: printf(“Max is: %s\n”, );
输入输出示例:括号内为说明,无需输入输出
输入样例:
peach
pear
melon
orange
berry
输出样例:
Max is: pear
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
int i;
char a[80], max[80];
cin>>a;
strcpy(max,a);
for(i=1; i<5; i++)
{
cin>>a;
if( strcmp(max,a)<0 )
strcpy(max,a);
}
cout<<"Max is: "<<max<<endl;
return 0;
}
R7-8 查找奥运五环色的位置
奥运五环的5种颜色的英文单词按一定顺序排列{“red”, “blue”, “yellow”, “green”, “black” },定义指针数组并初始化,输入任意一个颜色的英文单词,从已有颜色中查找并输出该颜色的位置值,若没有找到,则输出"Not Found"。
输入格式:
输入一个代表颜色的单词。
输出格式:
输出单词对应的位置值,如果未找到,输出Not Found。
输入样例:
yellow
输出样例:
3
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
char *p[] ={"red", "blue", "yellow", "green", "black"};
int i;
char tmp[100];
cin>>tmp;
for(i=0;i<5;i++)
{
if(strcmp(tmp,p[i])==0)
{ cout<<i+1; break; }
else if(i==4)
cout<<"Not Found";
}
return 0;
}
R7-9 字符串的连接
本题要求编写程序,使用指针方式实现两个字符串的连接(不能使用strcat函数),并将连接后的字符串输出。
输入格式:
输入一行以回车结束的非空字符串(不超过40个字符),再输入一行以回车结束的非空字符串(不超过40个字符)。
输出格式:
一行输出俩字符串连接后新的字符串。
输入样例:
Beijing_
China
输出样例:
Beijing_China
#include<iostream>
using namespace std;
void * mystrcat(char *a, char *b)
{
int i = 0;
int k = 0;
while (a[i] != '\0')
{
i++;
}
while (b[k] != 0)
{
a[i] = b[k];
i++;
k++;
}
a[i] = '\0';
return a;
}
int main()
{
char a[80];
char b[80];
cin.getline(a, 80);
cin.getline(b, 80);
mystrcat(a, b);
cout << a ;
}