目录
变量
变量存在的意义是为了更加方便的操作内存。再次调用内存时就可以不用使用地址串,而是使用变量名。
int a = 10;
cout <<" a= "<< a <<endl;
常量
- 宏常量(#define)
#include <iostream>
using namespace std;
#define Day 7int main(){
Day = 8;
cout<<"一周有"<< Day <<"天"<<endl;
system("pause");
}
- const修饰的变量(不可修改)
报错,只分配给可变类型:
关键字
sizeof
用于统计数据类型的所占内存空间
标志符命名规则
- 不能是关键字
- 可以使字母、下划线、数字
- 首字符只能是下划线、字母
- 命名是区分大小写的
数据类型
数据类型存在的意义:给变量分配合适的内存空间(避免造成资源浪费)
-
整型
-
浮点型
值得注意的是,在没有主动设置的情况下,c++默认显示6位小数:
float f1 = 3.1415926; //可以在后面加上一个f(float f1 = 3.1415926f)
double d1 = 3.1415926;
cout << "f1 = " << f1 << endl;
cout << "d1 = " << d1 << endl;
科学计数法:
f1 = 3e2; //300
f2 = 3e-2; //0.03
字符型
- 字符型变量需要用单引号括起(不能使用双引号)
- 单引号中只能是一个字符(不能是一个字符串)
- 每一个字符变量只占一个字节
- 值得注意的是,字符型变量并非将字符放进内存,而是将字符对应ASCII编码存进
cout << (int)a << endl ;
字符串
- C风格字符串
char 变量名[ ] = "字符串值"
char str1[ ] = "Hello World";
cout << "str1 = " << str1 << endl;
- C++字符串
string str2 = "hello world"
cout << "str2 = " << str2 << endl;
注意要引用一下头文件:
#include <string>
布尔类型
bool flag1 = true;
bool flag2 = false;
cout << flag1 << endl;
cout << flag2 << endl;
布尔数所占空间为一个字节,其本质就是1、0
输入输出
int s;
cout << "请输入整数s的值:" << endl;
cin >> s;
cout << "s = " << s << endl;
转义字符
//
/n
/t (一个/t是占8个位置)
运算符
- 算术运算符
- 赋值运算符
- 比较运算符
- 逻辑运算符
算术运算符
注意:
- 取模运算时,除数不能为零
- 两个小数不能做取模运算
- 注意前置递增和后置递增的区别
赋值运算符
比较运算符
比较的结果返回的是布尔值(0、1),即布尔值。
逻辑运算符
注意:
- 在C++中。除了零都是真
- &&(同真才为真)
- ||(同假才为假)
程序流程结构
-
顺序结构
-
选择结构
if( 判断条件 );注意这里不要加分号,不然不管条件是否满足都会执行大括号中的程序
{
执行程序
}
三目运算符:
int p = 1;
int q = 2;
int r;
r = p < q ? p : q;
cout << r << endl;
如果返回的是变量,该变量可以进行赋值:
int p = 1;
int q = 2;
int r = 3;
( p > q ? p : q ) = r; //谁大输出谁,然后进行赋值
cout << p << endl;
switch语句
switch( 结果 ) {
case 结果1:执行程序1;break;
case 结果2:执行程序2;break;
case 结果3:执行程序3;break;
}
-
循环结构
while
do while
区别在于do while需要先执行一次循环语句,再进行第一次判断
for
for( 起始表达式;条件表达式;末尾循环体){
循环语句;
}
跳转语句
break
作用是直接跳出整个循环体
使用时机:
- 出现在switch
- 出现在循环语句
- 出现在嵌套循环语句
continue
作用是跳过后面未执行的语句
goto
作用是从此处跳转到标记的位置
----
----
goto FLAG ;
----
----
FLAG :
----
不要轻易使用goto,容易造成程序阅读紊乱。
数组
一维数组定义方法:
- 数据类型 数组名[ 数组长度 ]
- 数据类型 数组名[ 数组长度 ] = { n1,n2,n3……}
- 数据类型 数组名[ ] = { n1,n2,n3……}
一维数组名:
- 所占空间
sizeof(arr) ; //可求得数组所占空间
- 数组首地址:
int a[ ] ;
cout << (int)a << endl ;
- 第一个元素地址:
cout << (int)&a[0] <<endl ;
这里值得注意的是:有些电脑上直接将十六进制强制转换成十进制会报错
原因是,int类型是占4个字节,而c++中int类型数组地址是12位十进制数,所以int的四个字节是不够的,至少需要8个字节。所以解决方法是:在win中转成long long,或者linux中转成long。
二维数组定义方法:
- 数据类型 数组名[ 行数 ] [ 列数 ] = //直接对每一个位置进行赋值
- 数据类型 数组名[ 行数 ] [ 列数 ] = { {数据1,数据2……} ,{数据3,数据4……} }
- 数据类型 数组名[ 行数 ] [ 列数 ] = {数据1,数据2,……}
- 数据类型 数组名[ ] [ 列数 ] = {数据1,数据2,……}
注意二维数组定义时可以省略行数,但不能省略列数。
二维数组名:
- 所占空间
sizeof( arr ); //arr是一个二位数组
sizeof( arr[ 0 ] );
sizeof( arr[ 0 ][ 0 ] );
- 首地址
int a[ ][ ] ;
cout << (int)a << endl ; //二维数组首地址
cout << (int)a[ 0 ]<< endl ; //第一行的首地址
cout << (int)a[ 0 ][ 0 ]<< endl ; //第一个元素的首地址
函数
将一段经常使用的代码进行封装,减少重复代码。
函数的定义:
- 返回值类型
- 函数名
- 参数列表
- 函数语句
- 返回值表达式
函数的调用:
//定义一个函数
int add (int num1,num2) {
int sum = num1 + num2;
return sum;
}
//主函数
int main (){
int a = 10;
int b = 20;
int r = add(a,b);
cout << "c = " << c << endl;
system("pause");
}
值传递:
函数中形参的改变不会影响函数外实参的值!
本质是因为实参通过函数的形参传入时,会重新开辟地址!所以函数中是对新地址进行操作!
函数的常见样式:
- 无参无返
- 无参有返
- 有参无返
- 有参有返
函数的声明:
当将函数具体实现写在主函数后面时,就需要先进行函数的声明。
注意:声明可以有很多次,但定义只能有一次!!!
函数的分文件编写:
- 创建 .h 的头文件
- 创建 .cpp 的源文件
- 头文件中写函数的申明
- 源文件中写函数的定义
指针
通过指针来保存一个地址,更简单的说,指针就是地址。
指针的定义与使用:
//数据类型 * 指针变量名;
int a = 10;
int *p;
p = &a;
cout << &a << endl; //这两条语句输出是一样的打印的是地址
cout << p <<endl;
可以通过解引用的方式,简介访问指针所指向的内存:
//接上
*p = 100;
cout << a << endl; //这两条语句输出是一样的,打印的是变化后的值100
cout << *p <<endl;
指针所占空间:
在32位操作系统下,任何类型指针所占空间为4个字节,64为操作系统下占8个字节。
空指针和野指针:
空指针
- 内存中编号为零的空间
- 用于初始化指针
- !!!空指针这块内存虽然存在,但不可访问
对于第三点:空指针这块空间是真实存在的,但没有权限访问。
没有语法错误,能够被编译,但是运行后:
退出代码 -1073741819 (0xC0000005) 通常表示一个程序试图访问它没有权限访问的内存区域,这通常被称为"访问违规"(Access Violation)或"段错误"(Segmentation Fault)。
野指针
- 指向了非法空间
const修饰指针
- 指针的指向可以修改
- 指针指向的值不能修改
代码第28行,是对指针的解引用,报错。而29行是修改指针的指向,没报错。报错原因是:无法将值赋给只读类型。
总结:
- 常量指针---const int *p //可修改指向,不可修改指针指向的值
- 指针常量---int * const p //可修改指向的值,不可修改指针指向
- const int * const p //两者都不可修改
指针和数组:
//利用指针访问数组中的元素
int arr[ 5 ] = { 1,2,3,4,5 };
int *p;
p = arr;
cout << *p << endl; //访问第一个元素
p++;
cout << *p << endl; //指针向后移动一个,指向了数组中第二个元素
指针和函数:
地址传递
这里的重点是理解为什么,地址传递可以改变实参的数据。
简单来说,就是地址传递是通过地址进行参数的访问,而值传递是开辟另外的空间进行操作。
结构体:
结构体属于用户自定义的数据类型,允许用户储存不同类型的数据类型。
结构体的定义和使用
基本语法:struct + 结构体名 + { 成员列表 }
//结构体变量的创建
- struct + 结构体名 + 变量名; //变量名.属性
- struct + 结构体名 + 变量名 = { 属性值列表 };
- 在定义结构体时顺便创建变量
结构体数组
基本语法:struct + 结构体名 + 数组名[ 元素个数 ] = { {属性列表1} ,{属性列表2},…… };
结构体指针
写在最后
本文是关于c++最基本知识的总结,适用有C语言基础的学习者,知识点比较简单,但还算比较全面。