C++笔记(一)
浮点数据类型
float f1 = 3.14f; //如果不写这个f,那么程序会默认为这个是double类型
//因此,这段代码会经过一个强制类型转换成float。
转义字符
- 水平制表符\t
cout << "a\thello" << endl;
cout << "aa\thello" << endl;
cout << "aaa\thello" << endl;
//这三行代码的输出,会非常的整齐:
// a hello
// aa hello
// aaa hello //制表符会自动调整宽度,可以整齐的输出
三目运算符
- 语法:表达式1 ? 表达式2 : 表达式3
- 解释:如果表达式1的值为真,执行表达式2,并返回表达式2的结果(反之就是表达式3)。
c = a > b ? a :b; //给c赋值:a和b中最大的值
a > b ? a : b = 100; //给a和b中最大的值,赋值100
循环结构
-
while语句是先进行判断,再运行语句
-
do…while语句是先运行一次循环,再进行判断。
-
- 语法:do{循环语句} while(循环条件);
-
for循环执行顺序:
跳转语句
- break:跳转出最近的内层循环,是直接退出循环,而不是进行下一次循环
- continue:不执行剩下的语句,直接进行下一次循环
- goto:无条件跳转
goto flag; //程序执行到这里,会强制跳转到flag标记处
flag: //需要要有标记处
...
指针
- 指针就是地址,既然是地址,那么所占用的大小,也就是int大小(32位系统占用4字节,64位系统占用8字节,一般都是32字节的)
int a = 10;
int *p; //定义int型指针,p就是一个地址
p = &a; //&a就是取地址,此时,p是a的地址
cout << *p << endl; //*解引用,找到p作为地址所指向的值
//*p = 10
空指针
- 不可访问,默认指向了0地址(0~255地址被系统占用)。
- 一般用于你有一个指针,暂时不知道赋什么值
int *p = NULL; //空指针
const修饰指针
- 常量指针:指针的指向可以修改,但是指针指向的值不可修改
- 指针常量:指针的指向不可修改,但是指针指向的值可以修改
- 修饰指针和常量:指针的指向和指针指向的值都不可修改
int a = 10;
int b =20;
const int *p = &a; //常量指针
*p = 20; //错误,指针指向的值不可以修改
p = &b; //正确,指针的指向可以修改
int const *p = &a; //指针常量
*p = 20; //正确,指针指向的值可以修改
p = &b; //错误,指针的指向不可修改
const int const *p = &a; //修饰指针和常量,都不可修改
指针与函数
void swap(int *p1, int *p2){
int temp = *p1;
*p1 = *p2; //用解引用的方式,p1地址指向的值
*p2 = temp;
}
int main(){
int a = 10;
int b = 20;
swap(&a, &b); //将a,b取地址,可改变形参和实参
}
结构体
定义和使用(三种方式)
struct student{
string name;
int age;
int score;
};
//}s3; //对应方式三的形式
int main(){
student s1; //方式一:直接声明一个结构体
student s2 = {"李四", 19, 90}; //方式二:声明结构体是直接赋值
s3.name = "王五"; //方式三:在结构体的最后命名s3,可以直接使用
}
结构体数组
struct student{
string name;
int age;
int score;
};
int main(){
student arry[3] = {
{"张三",19,90},
{"李四",20,91}
}; //直接赋值的方式
arry[1].name = "王五"; //可以对数组直接使用.运算符,访问数据
}
结构体指针
- 就是使用指针访问结构体中的变量,使用->运算符
struct student{
string name;
int age;
int score;
};
int main(){
student s = {"张三", 19, 10};
//int *p = &s; //必须对应到s的类型
student *p = &s; //定义一个指针指向结构体
cout << p->name << endl; //指针访问结构的变量,使用->运算符
}
结构体做函数参数
- 有值传递(形参修改不会影响实参的值)和地址传递(形参和实参相同,修改任一项都会更改另一项)两种
//定义结构体同上,struct student
void printstudent1(student s){
s.age = 20; //值传递不会修改实参的值,因此没用
cout << s.name << endl; //值传递使用.运算符访问
}
void printstudent2(student *p){ //形参是定义一个指针
s->age = 20; //地址传递会修改实参的值
cout << p->name << endl; //地址传递使用->运算符访问
}
int main(){
student s = {"战三", 29 ,10};
printstudent1(s);
printstudent2(&s); //使用地址传递,也需要对应使用取地址符号
}
结构体中const使用
- 由于地址传递可以更改实参的值,为了防止误操作而修改的实参的值,因此引入了const。
//结构体定义如上:struct student
void printstudent2(const student *p){ //在形参时添加const
s->age = 20; //这里会报错,因此使用了const不能修改实参的值
//const就是让函数中的操作只可以读,不可以
cout << p->name << endl; //地址传递使用->运算符访问
}