工作笔记20170706

工作日记20170706

2017年7月6日 周四

C++学习之复合类型以及复习题

复合类型之指针

1,指针 一个变量,储存值的地址而不是值本身。

声明和初始化:

//-----------------声明-------------------
int * p_updates;  // p_updates指向int类型,*p_updates是int,p_updates是指针
int* p1, p2;     //表示p1是指针,p2是int
//----------------初始化-------------------
int higgens = 5;
int * pt = &higgens;//&higgens用来显示指针higgens的地址

2,一定要在对指针应用解除引用运算符(*)之前,将指针初始化为一个确定的、适当的地址。这是关于使用指针的金科玉律。

// 下面没有将地址赋给fellow,所以错误
long * fellow;
*fellow = 223323;
// 下面,左边是指向int的指针,右边是整数,所以错误
int * pt;
pt = 0xB8000000;
// 下面的正确
int * pt;
pt = (int *) 0xB8000000;

3,使用new来分配内存,使用delete释放内存。

int * pn = new int;
delete pn;

4,用指针创建动态数组。

int * psome = new int [10];
delete [] psome;

5,在cout和多数C++表达式中,char数组名、char指针以及用引号括起的字符串常量都被解释为字符串第一个字符的地址。

6,数组的替代品
- 模板类 vector : vector<int> vi(n)
- 模板类array(C++):array<double, 4> ad = {1.2, 2.1, 3.43, 4.3};

复习题

1,如何声明下述数据?
  • actors 是由 30 个 char 组成的数组。char actors[30];
  • betsie 是由 100 个 short 组成的数组。short betsie[100];
  • chuck 是由 13 个 float 组成的数组。float chuck[13];
  • dipsea 是由 64 个 long double 组成的数组。long double dipsea[64];
2,使用模板类 array 而不是数组来完成问题 1 。
array<char, 30> actors;
array<short, 100> betsie;
array<float, 13> chuck;
array<long double, 64> dipsea;
3,声明一个包含 5 个元素的 int 数组,并将它初始化为前 5 个正奇数。
int oddly[5] = {1,3,5,7,9};
4,编写一条语句,将问题 3 中数组的第一个元素和最后一个元素的和赋给变量even。
int even = oddly[0] + oddly[4]; 
5,编写一条语句,显示 float 数组 ideas 中的第二个元素的值。
cout << ideas[1] << endl;
6,声明一个 char 的数组,并将其初始化为字符串 “cheeseburger”。
char lunch[13]="cheeseburger";//13=strlen(cheeseburger)+1因为最后一个是空字符
char lunch[]="cheeseburger";
7,声明一个 string 对象,并将其初始化为字符串 “Waldorf Salad”。
string lunch = "Waldorf Salad";
std :: string lunch = "Waldorf Salad";
8,设计一个描述鱼的结构声明。结构中应当包括品种、重量(整数,单位为盎司)和长度(英寸,包括小数)。
struct fish {
    char kind[20];
    int weight;
    float length;
};
9,声明一个问题 8 中定义的结构的变量,并对它进行初始化。
fish petes =
{
 "trout",
 12,
 26.25
};
10,用 enum 定义一个名为 Reponse 的类型,它包括 Yes、No 和 Maybe 等枚举量,其中 Yes 的值为 1 ,No 为 0 , Maybe 为2。
enum Reponse {No, Yes, Maybe}
11,假设 ted 是一个 double 变量,请声明一个指向 ted 的指针,并使用该指针来显示 ted 的值。
double * pd = &ted;
cout << *pd << endl;
12,假设 treacle 是一个包含 10 个元素的 float 数组,请声明一个指向 treacle 的第一个元素的指针,并使用该指针来显示数组的第一个元素和最后一个元素。
float * pf = &treacle[10];
cout << pf[0] << " " << pf[9] << "\n";
// cout << *pf << " " << *(pf + 9) << endl;
13,编写一段代码,要求用户输入一个正整数,然后创建一个动态的 int 数组,其中包含的元素数目等于用户输入的值。首先使用 new 来完成这项任务,再使用 vector 对象来完成这项任务。
假设已经包含了头文件 isotream 和 vector,并有一条using编译指令:
unsigned int size;
cout << "输入一个正整数: ";
cin >> size;
int * dyn = new int [size];
vector<int> dv(size);
14,下面的代码是否有效?如果有效,它将打印出什么结果?
cout << (int *) "Home of the jolly bytes";

它是有效的。表达式是一个字符串常量,因此,它将判定为字符串开始的地址。cout 对象将 char 地址解释为打印字符串,但类型转化(int*)将地址转化为int指针,然后作为地址被打印。总之,该语句打印字符串的地址,只要 int 类型足够宽,能够存储该地址。

15,编写一段代码,给问题 8 中描述的结构动态分配内存,再读取该结构的成员的值。
struct fish
{
   char kind[20];
   int weight;
   float length;
};
fish * pole = new fish;
cout << "输入鱼的种类:";
cin >> pole->kind;
16,程序清单 4.6 指出了混合输入数字和一行字符串时存储的问题。如果将下面的代码:cin.getline(address,80);替换为cin >> address;将对程序的运行带来什么样的影响?

这将使得程序跳过空白,直到找到非空白字符为止。然后它将读取字符,直到再次遇到空白为止。因此,它将跳过数字输入后的换行符,从而避免这种问题。另一方面,它只读取一个单词,而不是整行。

17,声明一个 vector 对象和一个 array 对象,它们都包含 10 个 string 对象。指出所需的头文件,但不要使用 using。使用 const 来指定要包含的 string 对象数。
#include <string>
#include <vector>
#include <array>
const int Str_num {10};
...
std::vector<std::string> vstr(Str_num);
std::array<std::string, Str_num> astr;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值