2.3复合类型
前言:真正完整的声明语句--》由基本数据类型 + 声明符列表(指定变量名,还有该变量与基本数据类型之间的关系)
2.3.1引用
引用:变量的别名,通过&字符声明,别名就指的是引用不是一个对象,对引用或变量的操作都会引起另一方同时变化。
注意的:
1.不能声明引用的引用(因为引用本身不是一个对象)
2.引用在赋初始值时必须要求左右类型一致
2.3.2指针
指针的声明:*d *为关系指定符,d是变量名
指针用来存放某个对象的地址,获取地址符 &
如
int val, *p = &val; // p 是指向变量 val的指针
解引用符 * 通过指针访问对象
示例:int val, *p = &val; std::cout << *p 等价于 std::cout << val;
重点:理解符号的多重含义
" & " --- 引用的声明 或 取地址符
" * " --- 指针的声明 或 解引用符
关键在于区分使用符号是的语境和具体对象
空指针:C++11新的声明方法 nullptr 关键字 nullptr 可以转换成任意所需类型的指针
指针参与逻辑运算的规则:
(1)任何合法的非空指针做条件判断时皆为true
(2)两个指针可以使用 ==,!=运算符做判断 当两指针存放地址相同时 两指针相等
赋值和指针:
指针和引用不同,指针可以改变内容(地址) 从而指向新的对象
如 int *p = 0, val = 0; p = &val; // 指针的值被改变 *pi = 0; // 指针所指对象的值被改变
void 指针:存放任意对象的地址
常用于指针的比较 函数的参数 输入输出 不能直接操作 void * 所指向的对象
理解复合类型的声明:
指向指针的指针:通过*的个数区别值指针的级别 解引用指针的指针 得到到仍然是一个指针
指向指针的引用:
int i = 10; int *p = &i; int *&r = p; // 说明 r 是一个 指针p的引用
练习
// p50 练习 2.18 编写代码更改指针的值与指针所指向对象的值
#include<iostream>
int main(){
int val = 10, *p1 = &val; // p1 -> val
int val2 = 15;
std::cout << "初始化声明指针*p1 = " << *p1 << std::endl;
// 更改指针的值 指向 val2
p1 = &val2;
std::cout << *p1 << std::endl;
// 更改指针所指向对象的值 val2
*p1 = 16;
std::cout << val2 << std::endl;
return 0;
}
// 叙述代码的作用 ~ i = i*i;
#include<iostream>
int main(){
int i = 42;
int *p1 = &i;
*p1 = *p1 * *p1;// i = i*i;
std::cout << i << " " << 42 * 42 << std::endl;
return 0;
}
结构体:自定义数据结构练习
#include<iostream>
struct Sales_data {
std::string bookNo;
/*书号*/
unsigned int units_sold = 0; // c++ 11 类内初始值 不能使用圆括号
/*销售数量*/
double revenue = 0.0;
/*销售总额*/
double price = 0.0;
/*单价*/
};
// 设计程序 读入 两次数据 如果书号相同
// 打印书号 销售数量 平均销售价格 否则 打印错误信息
int main(){
Sales_data data1, data2;
std::cin >> data1.bookNo >> data1.units_sold >> data1.price;
std::cin >> data2.bookNo >> data2.units_sold >> data2.price;
data1.revenue = data1.units_sold * data1.price;
data2.revenue = data2.units_sold * data2.price;
std::cout << "data1 revenue : " << data1.units_sold * data1.price << std::endl;
std::cout << "data2 revenue : " << data2.units_sold * data2.price << std::endl;
if(data1.bookNo == data2.bookNo){
std::cout << data1.bookNo << " average revenue ";
double total = ((data1.revenue + data2.revenue) / (data1.units_sold + data2.units_sold));
std::cout << total << "$" << std::endl;
return 0;
}else{
std::cout << "Data must refer to the same ISBN" << std::endl;
return -1;
}
}
头文件处理:
示例
#ifndef SALES_DATA_H
#define SALES_DATA_H
#include<string>
struct Sales_data{
std::string bookNo;
/*书号 ISBN*/
unsigned int units_sold = 0;
/*销售数量*/
double revenue = 0.0;
/* 收益 */
};
#endif
// ifndef endif 均为头文件保护符
尝试一下使用自定义的头文件做个书店的小项目吧~~~~~








网友评论