变量存在的意义:方便我们管理内存空间 变量存在的意义:方便我们管理内存空间
变量创建的语法:数据类型 变量名=变量初始值;
int a = 10 ;
关键字
标识符命名不能数字开头
int 最常用 short只能输出+- 32767以内的数字 不然溢出
可以利用sizeof()求数据类型占用空间
有效数字把整数位也算上,不只是算小数。
float f1 = 3.14f; //最后f表示这个3.14数字是float类型的
float f1 = 3.14; //3.14这个数字是double类型的 但是f1是float
默认情况下一个小数输出只输出(显示,不是存储)最多6位有效数字
科学计数法
float f2 = 3e2; // 3*10^2
cout << "f2=:" << f2 << endl; //300
float f3 = 3e-2; // 3*10^-2
cout << "f3=:" << f3 << endl; //0.03
char ch = 'a';
cout << ch << endl; //a
cout << "char字符所占的空间:" << sizeof(char) << endl;
cout << (int)ch << endl; // 97
注意是\不是/ 注释是// 输出斜杠是\\
\t:制表表示生成一个八个空格区域 跟前面的内容一起补齐8个空格 比如a\t 那就1个a 7个空格
用于水平对齐每一行
注意C风格中 char str[]=“XXXX” 这个中括号[]不可以少 不然就是单字符 而且要双引号 不是单引号 不然是单字符
C++风格 用string时 要加入一个头文件 #include<string>
定义初值用true 也可以用数字1 2 3 100……
给bool用键盘赋值时要用数字赋值 比如0 1 2 3
不能再用true
bool flag =true ;
cout << "请给flag赋值:" <<endl;
cin >> flag;
cout << "flag=" << flag<< endl;
主要看最后面的几个
/为除
%为取余数
注意:两个整数用/相除的时候会舍去小数部分 只留下整数部分
注意:俩小数不可以用% 即不可以取模 取余数
前置:先写运算 再写变量 效果是先运算(+1 -1) 再表达式运算
后置:先写变量 再写运算 效果是先表达式运算(整个式子算完) 再运算(+1 -1)
!= 为不等于
输出的结果是真或者假 即1或者0
注意cout<<(a==b)<<endl;
中间的a==b必须加括号 因为==的优先级没有<<高。
注意:在C++中除了0都为1 只要不是0 都为真 只有0 才是0 为假 不过习惯用1代表真 但是0.1 也算真(小数注意是double 别int)
注意:if条件后不要加分号 (){}是连在一起的
if …… else if …… else
比如:
int a = 10;
int b = 20;
int c = 0;
c=(a > b ? a : b);
cout << "c=" << c << endl; //20
实现把a和b中更大的值赋值给c
每个case分支都要加break,不然会顺序结构往下走其他case里的情况 case只是选择了一个开头
不在所有case里的其他情况就是default:
while(1)的时候表示一直运行
rand()%100:生成随机数 范围为0~99
break也可以在while里退出循环
srand((unsigned int)time(NULL));//随机数种子 利用当前时间得到随机数,防止每次生成的都是42伪随机
do while一定会先做一次 再来判断
通常约定俗成外层的循环变量因子为i 内层为j
可以用于筛选
注意:下标从0开始
cout arr时输出的是16进制的地址,但是cout (int)arr就输出10进制了
直接输出arr是arr的地址,但是要想看元素比如arr[1]的地址 要加& 不然输出的是这个元素的值而不是地址
比如cout (int)&arr[1]
N个数字,做N-1轮排序,第i轮的对比次数是N-i
每次冒泡排序都能找出一个当前最大值 就这样找N-1个最大值配合最后一个数排序完成
注意第二种方式里数据不一定只有四个 举例子二一
中间记得也要加逗号!
第四种记住 可以少行数 不能少列数!
总结:函数定义里小括号内称为形参,函数调用时传入的参数称为实参
如果函数不需要返回值,声明的时候可以写void
后面可以不跟(最好)或者跟return;
值传递:不会影响实参,仅仅是形参改变
声明可以先调用再定义
#include“” 双引号表示自己定义的一个头文件! <>表示尖括号
系统自带的头文件用尖括号括起来,这样编译器会在系统文件目录下查找。
源文件里要加入#include“头文件.h”
注意:头文件里不仅要写函数声明,也要加入
#include<iostream>
using namespace std;
int *p;
p=&a; //p的值是a的地址
注意:*p=a(所以可以直接修改*p来修改a) //*p的值是a的值
注意:指针保存的一直是地址不是值
总结:所有指针类型在32位操作系统下是4个字节
int * p = NULL;
不能修改空指针*p
注意:int *p=&a表示把a的地址用p指向
如果是int *p=0x1100 后面0x1100是一个数字 不是地址 我们可以用
int * p = (int *)0x1100;
就是在数字前面加入(int *)强行把他转换成一个地址 但是这样就变成了野指针
1. const int*p=&a;
常量指针
特点:指针的指向可以修改,但是指针指向的数值a不可以修改
即地址可以改(可以指向b c d) a的值不可以改
2. int * const p=&a
指针常量
特点:指针的指向不可以改 只能指向a 但是指向的数值a的大小可以改变
3. const int * const p =&a
特点:指针指向的东西和指向的东西的值都不能改
地址传递(不同于值传递):能改变实参
总结:如果不想修改实参,就用值传递,如果想修改实参,就用地址传递
总结:当数组名传入到函数作为参数时,被退化为指向首元素的指针
比如定义一个冒泡函数
void bubbleSort(int * arr, int len)
我们把一个数组arr[10]={}传递进去时,会退化成一个指针*arr 指向首个元素arr[0]
结构体就是一个数据类型 类似int
如果是结构体指针,那么用->代替.
比如student结构体的name 可以用xx.name 指针的话就是p->name
跟普通的值传递地址传递一样 只不过变量变成了结构体
地址传递中改变形参会带着把main函数里的实参也改变掉
8.7 结构体中 const使用场景
作用:用const来防止误操作
加指针是为了节省空间 不用再开辟一个空间给形参
加入const 对形参指针常量,一旦函数里对这个指针修改 就会报错!