C++
变量:
变量存在的意义:方便我们管理内存
变量创建的语法:数据类型 变量名 = 变量初始值;
int a = 20;
常量
作用:用于记录程序中不可更改的数据
C++定义常量两种方式
1.#define宏常量:
#define常量名常量值
通常在文件上方定义,表示一个常量
2.const修饰的变量:
const 数据类型 常量名 = 常量值
通常在变量定义前加关键字const,修饰该变量为常量,不可修改
字符串类型
作用:用于表示一串字符两种风格
1.C风格字符串: char 变量名[] = "字符串值”
注意:C风格的字符串要用双引号括起来
2.C++风格字符串:string 变量名[] = "字符串值”
布尔类型bool(只要是非0的值都代表真)
作用:布尔数据类型代表真或假的值
bool类型只有两个值:
true ---真(本质是1)false ---假(本质是0)
bool类型占1个字节大小
数据的输入
作用:用于从键盘获取数据
关键字:cin
语法:cin >>变量
int a = 0;
cout<<"请给整型变量a赋值:" << end1;
cin >> a;
cout <<"整型变量a = " << a << endl;
float f = 3.14f;
cout <<"请给浮点型变量f赋值:"> f ;
cout <<"浮点型变量f ="<< f > str;
cout <<"字符串str = " << str << endl;
三目运算符
作用:通过三目运算符实现简单的判断
语法:
表达式2:表达式3
解释:
如果表达式1的值为真,执行表达式2,并返回表达式2的结果;
如果表达式1的值为假,执行表达式3,并返回表达式3的结果。
C++中三木运算符返回的是一个变量,还可以继续赋值
int main() {
int a = 10;
int b = 20;
int c = 0;
c = (a > b ? a : b); //最终结果会返回给c
cout << "c = " << c << endl;
//C++中三目运算符返回的是变量,可以继续赋值
(a > b ? a : b) = 100;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
system( "pause");
return e;
c = 20
a = 10
b = 100
c = 20
内存分区模型
C++程序在执行时,将内存大方向划分为4个区域
代码区:
存放函数体的二进制代码,由操作系统进行管理的
全局区:
存放全局变量和静态变量以及常量
栈区:由编译器自动分配释放,存放函数的参数值,局部变量等
堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收
内存四区的意义:
不同区域存放的数据,赋予不同的生命周期,灵活编程
程序运行前
在程序编译后,生成了exe可执行程序,未执行该程序前分为两个区域
代码区:
存放CPU执行的机器指令
代码区是
共享的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可
代码区是
只读的,使其只读的原因是防止程序意外地修改了它的指令
全局区:
全局变量和静态变量存放在此.
全局区还包含了常量区,字符串常量和其他常量也存放在此.
该区域的数据在程序结束后由操作系统释放.
程序运行后
栈区:
由编译器自动分配释放,存放函数的参数值,局部变量等
注意事项:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放
堆区:
由程序员分配释放,若程序员不释放,程序结束时由操作系统回收
在C++中主要利用new在堆区开辟内存
new操作符
C++中利用new操作符在
堆区开辟数据
堆区开辟的数据,由程序员手动开辟,手动释放,释放利用操作符delete
语法:new数据类型
利用new创建的数据,会返回该数据对应的类型的指针
#include
using namespace std;
int * func(){
int *p = new int(10);
return p;
}
void test01(){ //堆区的数据,由程序员管理开辟,程序员管理释放
int *p = func();
cout << *p << endl;
cout << *p << endl;
cout << *p << endl;
// delete p; //释放堆区的数据
}
void test02(){ //在堆区创建10整形数据的数组
int *arr = new int[10];
for(int i = 0;i < 10;i++){
arr[i] = i;
}
for(int i = 0;i < 10;i++){
cout << arr[i] << endl;
}
delete[] arr; //释放数组时要加[]才行
}
int main(){
test01();
test02();
system("pause");
return 0;
}
结果:
10
10
10
加上delete之后堆区的数据被释放,就无法正常访问
1
2
3
...
10
引用
引用的基本使用
作用:给变量起别名
语法:数据类型 &别名 = 原名
int main(){
int a = 10;
int &b = a; //创建引用
cout << "a = " << a << endl;
cout<<"b = " << b << endl;
b = 100;
cout << "a = " << a << endl;
cout<< "b = " << b << endl;
system( ""pause");
return 0;
}
结果:
10
10
100
100
引用注意事项:
1、引用必须初始化
2、引用在初始化后,不可以改变
int main(){
int a = 10; //1、引用必须初始化
int &b; // 错误,必须要初始化int &b = a;
int c = 20; //2、引用在初始化后,不可以改变
b = c; //赋值操作,而不是更改引用
cout << "a = " << a <
int temp = a;
a = b;
b = temp;
}
int main(){
int a = 10;
int b = 20;
mySwap01(a,b); //值传递,形参不会修饰实参
cout << "a = " << a <
using namespace std;
//引用做函数的返回值
//1、不要返回局部变量的引用
int test01(){
int a = 10; //局部变量存放在四区中的 栈区
return a;
}
int &test02(){
static int a = 10; //静态变量,存放在全局区,全局区上的数据程序结束后系统释放
return a;
}
int main(){
int &ref = test01();
cout << "ref = " << ref <
ref = 100; //ref是引用,转换为*ref = 100
}
int main(){
int a = 10;
//自动转换为 int* const ref = &a;指针常量是指针指向不可改,也说明为什么引用不可更改
int &ref = a;
ref = 20; //内部发现ref是引用,自动帮我们转换为:*ref = 20;
cout << "a:" << a < endl;
cout << "ref:" << ref << endl;
func(a);
return 0;
}
结果
a:20
ref:20
结论:C++推荐用引用技术,因为语法方便,引用本质是指针常戳,但是所有的指针操作编译器都帮我们做了
常量引用
作用:常量引用主要用来修饰形参,防止误操作
在函数形参列表中,可以加const修饰形参,防止形参改变实参
#include
usring namespace std
//打印数据
void showValue(const int &value){ //用引用的方式传递
第二步: value = 1000;
cout << "value = " << value <
//常量引用
//使用场景:用来修饰形参,放置误操作
//int a = 10; //引用本身需要一个合法的内存空间,因此这行错误
//const int &ref = 10; //加上const之后,编译器将代码修改:int temp = 10;const int & ref = temp;
//const int &ref = 10; //引用必须引一块合法的内存空间
//ref = 20; //加入const之后变为只读,不可修改其值
int a = 100;
showValue(a);
cout << "a = " << a <