走走c++流程:基础知识,处理数据,指针危险及解决方案相关

基本数据类型处理

简单变量

变量名

    变量是c++中对于一个物体,东西概念的名称,代表着某些东西之后,就可以给它赋值
    c++声明变量的规则:
①、变量名只能由字符字符、数字和下划线组成,例如:_liming123
②、变量名第一个字符不可以是数字
③、大写字符和小写字符是在c++中是区分的
④、不能将关键字设为变量 例如:cout,cin,main,int
⑤、两个下划线 或者 下划线和大写字符 打头的名称被保留实现使用。以一个下划线开头的名称被保留给实现,用作全局标识符。
⑥、长度无限制,平台可能有限制

数据类型

一、整型
无小数部分的数,也就是常规的整数。
基本整型关键字有:short,int,long,long long
常规情况下,short 16位,int 32位,long64位,long long64位,以上数值不确定,跟操作系统的版本有关。存储单元一般是以8位为一字节,上面的字节数,是位数除以8就可以得到了。
16位是什么概念                         二进制的范围可以从下面看出来
0000000000000000-01111111111111111
1000000000000000-11111111111111111
也就是(-2^15 ~ 2^15-1)

相应的类型,有相应的范围,一旦超过这个范围,则程序会报错。

使用例子:

	int a=10;			//valid
	int b=65536;		//invalid (-65536~65535)
	short c=100;
	long d=1000;

二、字符型
char类型为字符型,一般可以认为是ascii码中有的,都可以设置为它,
贴张网图:在这里插入图片描述

例子:

	//字符使用单引号,字符串使用双引号
	char a='%';	
	char b='a';		//1
	char c=97;		//b与c一样,字符‘a’前面十进制数字,可以直接给char变量

三、浮点数
浮点数类型有:float ,double ,long double
float32位;double64位,最少48位,且大于float;long double可为80,128等,至少要大于double;

	float a=123.456f;	//可以在数字后面加上类型首字母,表示是这个类型的变量
	double b=123.456f;
	long double c=123.456l;
	long int d=123l;

数值后面加符号,是为了让程序员看数值就看出来这个变量是什么类型的变量。大规模的编程中,声明一个变量,在很远的地方会对其赋值或修改,如果能通过不远处别人对其进行的赋值能看出他的类型,那是相当好的。

四、布尔类型
布尔类型就是bool关键词声明的变量,声明bool类型,则其只有两个选项可以给该变量赋值,一个是true,一个是false。或者是1与0;一般用于判断

常量

常量一般指一个不可更改,始终如一的量,在程序运行过程中,常量是不可更改的。
c语言一般使用预处理方法**#define**,也叫宏定义,预处理方法又叫预编译,在编译前操作就已经完成。而设置的量,也是常量,如下所示,宏定义方法:

	#define Max 100		//中间空格,没有分好

c++提供更好的处理方法:限定符const,使用方法如下:

	//const type name=value;
	const int Max=100;

复杂变量

数组

声明方式:type name[length];
例子

	int a[10];
	char b[20];
	double b[];		//也可不填

数组当然也是存储数据的方式,那怎么存呢?

	for(int i=0;i<10;i++){
    
    
		a[i]=i;			//a数组从0-9,填的也是0-9
	}
	int b[5]={
    
    1,2,3,4,5};
	char c[5]={
    
    'a','b','c','d','f'};

字符串

1、字符与字符串的区别就是字符后面有’\0’,例如:

	char a[5]={
    
    'a','b','c','d','f'};	//普通字符数组,不是字符串
	char b[5]={
    
    'a','b','c','d','f','\0'};	//字符串
	
	//字符串常规形式
	char c[5]="abcdf";

2、string类
使用前声明头文件#include< string>,声明的时候可以直接使用string声明变量

	#include<iostream>
	#include<string>
	using namespace std;
	
	int main(){
    
    
		string name="zhangsan";		//声明方式
	}

3、其余字符串类
wchar ,char16_t (16位),char32_t(32位),Raw(原始字符串)

结构体

结构体声明关键字位:struct,接下来使用例子

	struct student{
    
    
		char name[20];
		int age;
		char sex;
	}stud{
    
    
		"黎明",
		43,
		'm'
	};				//不太使用这种初始化变量,分开比较清晰
	
	struct Teacher{
    
    
		char name[20];
		struct student stu[50];
		double wages;
		char course[10];
	};

	int main(){
    
    
		student s;
		Teacher teacher;
		teacher.stud[0]=stud;
		teacher.stud[1]=s;
		teacher.wages=10;
		teacher.course="数学";
		teacher.name="李四";
	}

共用体

共用体(union)是另一种特殊数据结构,主要功能就是节省内存,如何节省内存?,使用方法代码如下:

	union ab{
    
    
		int age;
		char *name;
		double length;
	};

	union ab exam;
	int main(){
    
    
		//调用方式与结构体相同
		cout<<exam.age<<exam.name<<exam.length<<endl;
	}

用法与结构体基本相同。
共用体中设置的变量,无论多少个变量,都是在一个存储空间内的,所以只有一个变量可以有值,其他的由于没有存储空间,存储的值将会丢失。
来一个例子:

	int main(){
    
    
		union ab exam;
		
		exam.age=10;
		exam.length=20;
		exam.name="张三";
		cout<<exam.age<<" "<<exam.name<<"  "<<exam.length<<endl;
	}

结果如下:
在这里插入图片描述
前面赋的值,后面全都覆盖了,所以全都丢失了。

一般嵌入式方向,内存不大,但是程序却要正常运行,则需要不断地精简内存的使用,union共用体就能够派上用场了。

指针

1、前面讲的数组就可以当做指针,指针设置方式:
                                          type *name=value;

	int *p;
	int a=10;
	p=&a;		//*p是一个值,p是一个地址,&a是一个地址

	while(p++);		//地址向后推

2、指针的危险
由于指针需要一个位置存储,数据需要一个位置存储,声明后的指针变量仅仅有了自己存的地方,但是变量的值存在哪里呢?若不初始化指针指向的地址,则会出现非常隐匿的BUG,如下

	int *p;
	*p=1001;		//1001存到了何处?谁也不晓得

解决办法有两种,一种每次使用前都将变量的地址初始化好,像1一样赋值。
另一种使用new创建内存,代码如下:

	int *a=new int;		//创建了一个内存地址,使得指针a指向该内存区域
	*a=100;				//100存到了创建的内存空间里

上面的代码就要考虑到释放内存,这样指针第二个危险之处就出现了。c++释放使用的delete,但是释放了内存空间之后,指针还是存在的( 攀岩爱好者将铁钩勾上上面的岩石向上攀爬,但是delete之后,岩石没有了,铁钩和人怎么办? ),一旦再次使用这个指针就会出现问题。
在释放前需要将其指向NULL,c++中delete对空指针使用安全。( 在岩石消失前,必须让铁钩勾上其他岩石之后,钩子上的岩石才能消失
代码如下:

	*a=NULL:
	delete a;

循环与关系表达式

循环

1、for循环
使用形式:   for(初始化;测试;更新操作){主体}

	//形式:
	int i;
	for(i=0;i<10;i++){
    
    cout<<"第"<<i+1<<"次"<<endl;}
	
	//形式二
	int j=0;
	for(;j<10;j++){
    
    cout<<"第"<<j+1<<"次"<<endl;}

	//形式三
	for(int i=10;i;i--){
    
    cout<<"第"<<i+1<<"次"<<endl;}

2、while循环与do…while循环
while循环使用形式:while(condition){body;}      条件为1,则循环执行,直到条件为0,停止循环
do…while循环使用形式:do{body;}while(condition);    先执行循环体,执行完成后,若condition仍然是1,则继续循环,若为0,停止循环。

3、break与continue
break:停止该层循环体     continue:停止本次循环
代码解释:

	//break 演示
	for(int i=0;i<5;i++){
    
    
		for(int j=0;j<5;j++){
    
    
			if(j==2)break;
			cout<<j<<" ";
		}
	}			//j循环一旦j==2时,就会打断该循环
	//所以结果应该是:0 1 0 1 0 1 0 1 0 1		
	
	//continue 演示
	for(int i=0;i<5;i++){
    
    
		for(int j=0;j<5;j++){
    
    
			if(j==2)continue;
			cout<<j<<" ";
		}
	}			//一旦j=2,则j==2的循环就结束了,不会再执行cout<<j<<" "
//结果应该:0 1 3 4 0 1 3 4 0 1 3 4 0 1 3 4 0 1 3 4

表达式

优先级 运算符 含义 用法
1 () 圆括号
1 [ ] 下标运算符
1 ->  . 结构体成员运算符 a->age;a.age
2 逻辑非 a=0;if(!a)
2 ~ 按位取反 ~100
2 ++ 自加 i++先用后加,++i先加后用
2 - - 自减 同上
2 & 取地址符 &name获得name的地址
2 (类型) 类型转换 (int)age
2 sizeof 长度 sizeof(char)
2 - 负号 -5
2 * 指针 *p
3 * 1*2
3 / 2/1
3 % 5%3=2
4 + 5+3=8
4 - 5-3=2
7 == 等于 if(2==1)break;
7 != 不等于 if(2!=1)break;

猜你喜欢

转载自blog.csdn.net/wangzhiyu12/article/details/107143574
今日推荐