零基础学习C++之一:初识C++

一、初识C++

1. 变量

**作用:**给一段指定的内存空间起名,方便操作这段内存

语法:数据类型 变量名 = 初始值

#include<iostream>
using namespace std;
int main() {
	int a = 10;
	cout << "a = " << a << endl;
	system("pause");
	return 0;
}

2. 常量

**作用:**用于记录程序中不可修改的数据

C++定义常量两种方式:

  1. #define 宏常量:define 常量名 常量值
  2. const 修饰的变量const 数据类型 常量名 = 常量值
    • 通常在变量定义前加关键字const,修饰该变量为常量,不可修改。
#define day 7

int main() {	
	cout << "一周共有 " << day << "天" << endl;
	system("pause");
	return 0;
}
int main() {
	const int month = 12;
	cout << "本月还剩 " << month << "天" << endl;
	system("pause");
	return 0;
}

二、数据类型

C++规定再创建一个变量或者常量时必须要指定出相应的数据类型,否则无法给变量分配内存。

数据类型存在的意义:给变量分配一个合适的内存空间,不大也不小。

1. 整型

C++中能够表示整型的类型有以下几种方式,区别在于所占空间不同。

数据类型所占空间取值范围
short(短整型)2字节 − 2 15 -2^{15} 215~ 2 15 − 1 2^{15}-1 2151)=(-32768 ~ 32767)
int(整型)4字节 − 2 31 -2^{31} 231~ 2 31 − 1 2^{31}-1 2311
long(长整型)win 4字节 − 2 31 -2^{31} 231~ 2 31 − 1 2^{31}-1 2311
long long(长长整型)8字节 − 2 63 -2^{63} 263~ 2 63 − 1 2^{63}-1 2631

正数越界会变成负数,负数越界变成正数

2. sizeof关键字

**作用:**可以统计数据类型所占内存的大小

语法:sizeof(数据类型/变量)

实例:

int main() {
	short num1 = 10;
	int num2 = 10;
	long num3 = 10;
	long long num4 = 10;
	cout << "shor sizeof=" << sizeof(num1) << endl;
	cout << "int sizeof=" << sizeof(num2) << endl;
	cout << "long sizeof=" << sizeof(num3) << endl;
	cout << "long long sizeof=" << sizeof(num4) << endl;

	system("pause");
	return 0;
}
image-20221031214454055

3. 实型(浮点型)

**作用:**用于表示小数

浮点型变量分为两种:

  1. 单精度 float
  2. 双精度 double

两者的区别在于表示的有效数字范围不同。

数据类型占用空间有效数字范围
float4字节7位有效数字
double8字节15~16位有效数字
  • 默认情况下输出一个小数,会显示出6位有效数字。无论是float还是double。
int main() {
	float f1 = 3.1415926f;
	double f2 = 3.1415926;
	cout <<f1<< endl;
	cout  <<f2 << endl;

	system("pause");
	return 0;
}
image-20221101151716172
int main() {
	float f1 = 3.14f;
	double f2 = 3.14;
    
	cout << "sizeof(float)=" << sizeof(f1) << endl;
	cout << "sizeof(double)=" << sizeof(f2) << endl;

	system("pause");
	return 0;
}

image-20221101151412601

  • 使用科学计数法来表示小数

    int main() {
    	float f1 = 3e-2;		//3*0.1^2
    	float f2 = 3e2;		//3*10^2
    	cout <<f1<< endl;
    	cout  <<f2 << endl;
    
    	system("pause");
    	return 0;
    }
    
    image-20221101151922006

    语法:

    • e后面跟正数代表10^的几次方
    • e后面跟负数代表0.1^的几次方

4. 字符型

**作用:**字符型变量用于显示单个字符

语法:char ch = 'a'

注意:

  • 在显示字符型变量时,用单引号将字符括起来,不要用双引号(用双引号是字符串)

  • 单引号内只能有一个字符,不可以是字符串

  • C和C++中的字符型变量只占一个字节。

  • 字符型变量并不是把字符本身放到内存中存储,而是将相应的ASCII编码放到存储单元中

    int main() {
    	// 看到字符型变量对应的ASCII编码
    	char ch = 'A';
    	cout << (int)ch << endl;	//(int)是强制类型转换
    	system("pause");
    	return 0;
    }
    
    image-20221101152815835

常识:常见字母对应的ASCII码

  • A-65
  • a-97

5. 转义字符

  1. 换行符\n

    C++中的换行符是endl,和C中的"\n"效果一样:

    int main() {
    	
    	cout << "hello world!" << endl;		//C++
    	cout << "hello world!\n";			//C
    
    
    	system("pause");
    	return 0;
    }
    
    image-20221101153428116

6. 字符串型

**作用:**用于表示一串字符

C++中有两种风格的字符串:

  1. 延续C风格的字符串:char 变量名[] = "字符串值"

    注意事项:

    • 别忘记加中括号
    • 等号后面要用双引号包含起来字符串

    示例:

    int main() {	
    	char str1[] = "hello world!";
    	string str2 = "hello world!!";
    	cout << str1 << endl;
    	cout << str2 << endl;
    
    	system("pause");
    	return 0;
    }
    
  2. C++风格字符串:string 变量名 = "字符串值"

    注意事项:

    • 别忘记头文件要有:#include

7. 布尔数据类型

**作用:**布尔数据类型代表真或假的值

bool类型只有两个值:

  • true:真(本质是1)
  • false:假(本质是0)

bool类型只占1个字节的大小

C++中布尔类型只要非0的值都代表真

8. 数据的输入

**作用:**用于从键盘获取数据

**关键字:**cin

语法:cin >> 变量

实例:

int main() {
	
	//整型输入
	int a = 0;
	cout << "请输入整型变量" << endl;
	cin >> a;
	cout << a << endl;

	//字符串型输入
	string str = "";
	cout << "请输入字符串变量" << endl;
	cin >> str;
	cout << str << endl;


	system("pause");
	return 0;
}
image-20221101155207380

三、运算符

跟C一摸一样,运算逻辑也是

四、程序流程结构

选择、循环、跳转

跳转有一个goto语句

**作用:**可以无条件跳转语句

语法:goto 标记

  • 标记一般用大写字母表示。

**解释:**如果标记的名称存在,执行到goto语句时会跳转到标记的位置

int main() {

	cout << "1" << endl;
	goto FLAG;
	cout << "2" << endl;
	cout << "3" << endl;
	cout << "4" << endl;

FLAG:
	cout << "5" << endl;

	system("pause");
	return 0;
}

五、数组

1. 概述

数组:是一个集合,里面存放了相同类型的数据元素

特点:

  1. 数组中的每个数据元素都是相同的数据类型
  2. 数组是由连续的内存位置组成的

2. 一维数组

5.2.1 一维数组的定义方式

有三种:

  1. 数据类型 数组名[数组长度];
  2. 数据类型 数组名[数组长度] = {值1,值2,...};
  3. 数据类型 数组名[] = {值1,值2,...}

通过下标访问数组元素。

5.2.2 数组名用途

  1. 通过数组名查看数组首地址

    int main() {
    
    	int arr[5] = { 10,9,8,7,6 };
    	cout << arr << endl;
    
    	system("pause");
    	return 0;
    }
    

    0000004D290FF668

  2. 通过数组名统计整个数组占用内存大小

    int main() {
    
    	int arr[5] = { 10,9,8,7,6 };
    
    	cout << sizeof(arr) << endl;
    	cout << sizeof(arr[0]) << endl;
    	cout << sizeof(arr) / sizeof(arr[0]) << endl;
    
    	system("pause");
    	return 0;
    }
    
    image-20221101164442222

3. 二维数组

二维数组定义的四种方式:

  1. 数据类型 数组名[行数][列数];
  2. 数据类型 数组名[行数][列数] = {{1,2},{3,4}};
  3. 数据类型 数组名[行数][列数] = {数据1,数据2,数据3,数据4,...};
  4. 数据类型 数组名[][列数] = {数据1,数据2,数据3,数据4};

建议使用第二种,使代码更直观。

六、函数

1. 概述

**作用:**将一段经常使用的代码封装起来,减少重复代码

2. 函数的定义

函数的定义一般有5个重要步骤:

  1. 返回值类型
  2. 函数名
  3. 参数列表
  4. 函数体语句
  5. return表达式

语法:

返回值类型 函数名 (参数列表)
{
    函数体语句
    
    return 表达式
}

3. 值传递

  • 所谓的值传递,就是函数调用时将实参值传入给形参
  • 值传递时,如果形参发生改变并不会影响实参

4. 函数声明

声明可以写多次,但是定义只能有一次。

5. 函数的份文件编写

**作用:**让代码结构更加清晰

函数分文件编写一般有四个步骤:

  1. 创建后缀名为.h的头文件
  2. 创建后缀名为.cpp的源文件
  3. 在头文件中写函数的声明
  4. 在源文件中写函数的定义

示例:

image-20221101184754396 image-20221101184805251 image-20221101184820106

七、指针

1. 基本概念

**作用:**可以通过指针间接访问内存

  • 内存编号是从0开始记录的,一般用十六进制数字表示
  • 可以利用指针变量保存地址

2. 指针变量的定义和使用

指针变量定义语法:数据类型 *变量名;

示例:

int main() {
	int a = 10;
	int* a1 = &a;
	cout << a1 << endl;
	return 0;
}
image-20221101185335561

指针的使用:通过解引用的方式来找到指针指向的内存,可以通过指针前加*。

int main() {
	int a = 10;
	int* a1 = &a;
	cout << *a1 << endl;
	return 0;
}
image-20221101185827599

3. 指针所占空间

指针也是一种数据类型,那么他所占空间是多少?

在32位操作系统下,不论是什么类型的指针都站4个字节。

在64位操作系统下,不论是什么类型的指针都站8个字节。

int main() {
	int a = 10;
	int* a1 = &a;
	cout << sizeof(a1) << endl;
	return 0;
}
image-20221101190054390

4. 空指针和野指针

**空指针:**指针变量指向内存中编号为0的空间(因为这块空间是系统占用的)

  • int* p = NULL;

**用途:**初始化指针变量

**注意:**空指针指向的内存是不可以访问的

**野指针:**指针变量指向非法的内存空间

int main() {
	int* p = (int*)0x1100;
	//访问野指针报错
	cout << *p << endl;
	return 0;
}
image-20221101190931806

5. const 修饰指针

const修饰指针有三种情况:

  1. const修饰指针 --常量指针

    特点:

    • 指针的指向可以修改,但是指针指向的值不可以修改。

    • const int* p = &a;

      此时:

      • *p = 20 错误
      • p = &b正确
  2. const修饰常量 --指针常量

    特点:

    • 指针的指向不可以修改,指针指向的值可以修改。

    • int* const p = &a;

      此时:

      • *p = 20 正确
      • p = &b错误
  3. const即修饰指针,又修饰常量

    特点:

    • 指针的指向和指向的值都不可以修改。

    • const int* const p = &a;

      此时:

      • *p = 20 错误
      • p = &b错误

6. 指针和数组

利用指针访问数组中的元素。

int main() {
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int* p = arr;
	//数组名就代表数组的首地址,也就是第一个元素的地址
	cout << "arr=" << arr << endl;
	cout << "p=" << p << endl;
	return 0;
}
image-20221101193759226

使用指针访问数组第一个元素:

  • 方式一:

    cout << "arr[0]=" << p[0] << endl;
    
  • 方式二:

    cout << "arr[0]=" << *p << endl;
    

使用指针访问数组第二个元素:

  • 方式一:

    cout << "arr[1]=" << p[1] << endl;
    
  • 方式二:

    p++;
    cout << "arr[1]=" << *p << endl;
    

    此时是让指针向后偏移了4个字节

7. 地址传递

将参数中的形参改为指针,可以减少内存空间,而且不会赋值新的副本出来。

void swap(int *a, int *b) {
	int temp = *a;
	*a = *b;
	*b = temp;

}
int main() {
	int a = 10;
	int b = 20;
	swap(&a, &b);

	cout << "a=" << a << endl;
	cout << "b=" << b << endl;
	return 0;
}
image-20221101194935045

八、结构体

1. 基本概念

结构体书关于用户自定义的数据类型,允许用户存储不同的数据类型

2. 结构体定义和使用

语法:struct 结构体名{结构体成员列表};

例如:

//结构体定义
struct student {
	//成员列表
	string name;
	int age;
	int score;
	string sex;
};

通过结构体创建变量的方式有三种:

注意:C++创建变量时struct关键字可以省略。

  • struct 结构体名 变量名

    • struct student s1;
      s1.name = "张三";
      s1.age = 12;
      s1.score = 99;
      s1.sex = "男";
      
    • cout << "姓名:" << s1.name << "年龄:" << s1.age << "性别:" << s1.sex;
      
  • struct 结构体名 变量名 = {成员1值,成员2值...}

    • struct student s2 = {"李四",19,80,"女"};
      
    • cout << "姓名:" << s2.name << "年龄:" << s2.age << "性别:" << s2.sex << endl;
      
  • 定义结构体时顺便创建变量

    • //结构体定义
      struct student {
      	//成员列表
      	string name;
      	int age;
      	int score;
      	string sex;
      }s3;
      

**访问结构体变量属性:**通过"."来访问

s1.name

3. 结构体数组

**作用:**将自定义的结构体放入到数组中方便维护

语法:struct 结构体名 数组名[元素个数] = {{},{},{},...{}}

示例:

  • 创建结构体数组

    struct student arr[3] = {
    		{"张三",12,99,"男"},
    		{"李四",13,44,"男"},
    		{"王五",15,32,"女"}
    };
    
  • 遍历结构体数组

    for (int i = 0; i < 3; i++) {
    		cout << "姓名:" << arr[i].name << "年龄:" << arr[i].age << "分数:" << arr[i].score << "性别:" << arr[i].sex << endl;
    }
    
    image-20221101211230698

4. 结构体指针 ->

**作用:**通过指针访问结构体中的成员

  • 利用操作符->可以通过结构体指针访问结构体属性

示例:

student* p = &arr[0];
cout << "姓名:" << p->name << "年龄:" << p->age << "分数:" << p->score << "性别:" << p->sex;
image-20221101211957685

5. 结构体做函数参数

**作用:**将结构体作为参数向函数中传递

传递方式有两种:

  • 值传递

    void printStudent(student stu) {
    	cout << "姓名:" << stu.name << "年龄:" << stu.age << "分数:" << stu.score << "性别:" << stu.sex;
    }
    
    main(){
        printStudent(arr[2]);
    }
    
    image-20221101212342265
  • 地址传递

    void alertName(student* stu) {
    	stu->name = "嘎嘎";
    }
    
    
    main(){
        
        alertName(&arr[2]);
    	cout << arr[2].name;
    }
    

6. 结构体中const使用场景

**作用:**用const来防止误操作

image-20221102142945319 1101211957685" style="zoom: 67%;" />

5. 结构体做函数参数

**作用:**将结构体作为参数向函数中传递

传递方式有两种:

  • 值传递

    void printStudent(student stu) {
    	cout << "姓名:" << stu.name << "年龄:" << stu.age << "分数:" << stu.score << "性别:" << stu.sex;
    }
    
    main(){
        printStudent(arr[2]);
    }
    
    image-20221101212342265
  • 地址传递

    void alertName(student* stu) {
    	stu->name = "嘎嘎";
    }
    
    
    main(){
        
        alertName(&arr[2]);
    	cout << arr[2].name;
    }
    

6. 结构体中const使用场景

**作用:**用const来防止误操作

image-20221102142945319
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值