C语言学习笔记——变量

1.变量

1.1整数类型

1.1.1介绍

C语言中整数类型用于存放整数。例如int a =10

1.1.2整数类型的分类

        类型名称大小值范围
char1byte-2^7到2^7-1
short2byte-2^15到2^15-1
int4byte-2^31到2^31-1
long4byte-2^31到2^31-1
  1. C语言中的整形类型分为signed和unsigned,其中默认为signed,上表为signed
  2. C程序中整形常声明为int

1.2浮点类型

1.2.1介绍

C语言中浮点类型用于存放小数。例如float a = 7.3 

1.2.2浮点类型的分类

类型存储大小范围精度
float4byte1.2e-38到3.4E+386位小数
double8byte2.3E-308到1.7E+30815位小数
  1. 浮点数=符号位+指数位+尾数位(浮点数可以理解为近似值)
  2. 尾数部分可能会造成丢失,导致精度损失
  3. float变量需要在后面加上f
  4. %f默认默认6位小数 %.x保存x位小数
  5. #include<stdio.h>
    void main() {
    	float a1 = 7.32f;//float变量需要在后面加上f
    	double a2 = 6.23213213211;//%f默认默认6位小数 %.x保存x位小数
    	double a3 = .97;//等价于0.97
    	double a4 = 9.7e2;//等价于9.7*10^2
    	printf("a1=%f  a2=%f a2=%.15f a3=%f a4=%f", a1, a2, a2, a3, a4);
    }

1.3字符类型

1.3.1介绍

字符类型为char,大小为1byte,可以存储字母或者数字。

1.3.2代码

#include<stdio.h>
void main() {
	char c1 = 'a';//字符常量需要用两个单引号括号起来
	char c2 = 'b';
	char c3 = 97;//若对char赋值一个整数,它将会输出其对应的的ASCII码的字母或者符号

	printf(" c1 = %c c2 = %c c3 = %c", c1, c2, c3);

	int c4 = c2 + 40;//char类型可以进行运算
	printf(" c4 = %d", c4);

	char c5 = 'A';
	printf(" c5 = %c", c5);
}
  1. 字符常量需要用两个单引号括号起来
  2. 若对char赋值一个整数,它将会输出其对应的的ASCII码的字母或者符号
  3. char类型可以进行运算
  4. 存储:字符'a'→'a'ASCII码值(97)→(97)对应二进制数(1100001)→存储
  5. 读取:二进制数(1100001)→(1100001)对应十进制数(97)→(97)对应ASCII码'a'→读取

1.4布尔类型

  1. C89标准中,需要用宏定义方式定义布尔变量,且bool变量中非0即为真 0即为假
    #include<stdio.h>
    #define BOOL int
    #define TURE 1
    #define FALSE 0
    
    void main() {
    	//BOOL isOK = TURE;
    	BOOL isOK = FALSE;
    	if (isOK) {
    		printf("true");
    	}else {
    		printf("false");
    	}
    }

     
  2. C99下,提供了bool类型,但是与C89不同的是,仅存在0为假,1为真(C89下非0即为真),但是需要导入头文件stdbool.h
    #include<stdio.h>
    #include<stdbool.h>
    void main() {
    	bool c1 = false;
    	if (c1) {
    		printf("true");
    	}
    	else {
    		printf("false");
    	}
    }

  3. bool通常用于条件控制语句if,循环控制语句while

1.5基本数据类型转换

1.5.1介绍

当c程序在对变量进行赋值和运算时候,将会把精度较小的变量自动转换为精度较大的变量,即基本数据类型转换。

1.5.2数据类型按照精度大小排列为

short→int→long→float→double→long double

其中unsigned int大于signed int

1.5.3数据类型转换规则

char,short→int→unsigned→long→double

float→double

1.5.4代码

#include<stdio.h>
void main() {
	char a1 = 'a';
	int a2 = a1;
	double a3 = a2;
	
	printf("a1=%c, a2=%d, a3=%lf\n", a1, a2, a3);//char,short→int→unsigned→long→double
                                               //float→double

	char c1 = 97;
	int c2 = 100;
	int c3 = c1 + c2;
	
	printf("c3=%d\n", c3);//两个不同精度的变量进行运算,精度较小的变量会自动转换成精度较大的变量
	
	double b1 = 97.232141221564;
	float b2 = b1;
	printf("b2 = %.10f\n", b2);//精度较大的变量赋值给精度较小的变量,精度将会降低
}

  1.  char,short→int→unsigned→long→double
    float→double
  2. 两个不同精度的变量进行运算,精度较小的变量会自动转换成精度较大的变量
  3. 精度较大的变量赋值给精度较小的变量,精度将会降低

1.6强制类型转换

1.6.1介绍

强制类型转换与基本类型转换不同,是由精度大的转向精度小的变量。使用的时候需要加上强制转换符()。需要特别注意的是,强制类型转换有时候会造成精度降低或者溢出。

强制转换符:(类型名)表达式

1.6.2代码

#include<stdio.h>
void main() {
	double a1 = 9.7;//不改变a1的类型,a1仍然为double类型
	int a2 = a1;//如果不加(int)则会warning
	int a3 = (int)a1;//如果加(int)则不会warning,且直接截断小数后的部分,而非四舍五入
	printf("a1 =%f a2 = %d  a3 = %d\n", a1, a2, a3);
}

#include<stdio.h>
void main() {
	//强制转换只对最近的操作数有效,若要对整个操作数进行强制转换,则需要把操作数放在括号内
	int b1 = (int)9.7 * 10 + 6 *1.5;//9 * 10 + 6 * 1.5 = 99
	int b2 = (int)(9.7 * 10 + 6 *1.5);//9.7 *10 + 6 * 1.5 = 106.0→106
	//对整个计算括号起来后,就不会提示warning
	printf("b1 = %d b2 = %d\n", b1, b2);
}

 

#include<stdio.h>
void main() {
	char c1 = 'a';
	int c2 = 1;
	float c3 = 1.5f;
	double c4 = c1 + c2 + c3;//可以运行 不会有warning, float→double
	char c5 = c1 + c2 + c3;//warning float→char 
	printf("c4 = %.15f  c5 = %c", c4 ,c5);
}

 

  1.  强制数据转换是由大精度→小精度,且强制数据转换不改变原操作数的本身类型。如果不使用强制转换符,即(类型名)表达式,在大精度到小精度的转换过程中,则会出现warning,若使用则不会出现。
  2. 在强制转换过程中是直接截断小精度后的数字,而非四舍五入。
  3. 强制转换只对最近的操作数有效,若要对整个操作数进行强制转换,则需要把操作数放在括号内。

1.7指针入门

1.7.1代码

#include<stdio.h>
void main() {
	int a1 = 97;
	//a的地址为多少
	//1.输出变量的地址的格式为%p
	//2.&p表示取出变量p对应的地址
	printf("a1的值为=%d a1的地址为=%p\n", a1, &a1);

	//变量→变量地址→变量内容
	//定义一个指针变量
	//1.int *指的是一个指针类型的变量 
	//2.这个指针类型的变量的名字为ptr, ptr就是一个int *类型的变量
	//3.ptr指向一个int类型的变量的地址
	//4.取出ptr的自身地址,&ptr
	//5.取出ptr存放的a1的地址,ptr
	//6.取出ptr指向的地址的内容,*ptr
	int *ptr = &a1;
	printf("ptr的地址是%p  ptr存放的值是一个地址为%p  ptr指向的地址的内容为%d", &ptr, ptr, *ptr);
}

 

  1. 变量→变量地址→变量内容
  2. 输出变量的地址的格式为%p
  3. &p表示取出变量p对应的地址
  4. 指针的形式为数据类型*,int *指的是一个指针类型的变量
  5. 这个指针类型的变量的名字为ptr, ptr就是一个int *类型的变量
  6. ptr指向一个int类型的变量的地址
  7. 取出ptr的自身地址,&ptr下·
  8. 取出ptr存放的a1的地址,ptr
  9. 取出ptr指向的地址的内容,*ptr
  10. 指针的类型和它所指向的变量的类型需要一致

1.7.2指针练习

写一个程序,获取一个int变量num的地址,并显示到中断讲num的地址赋给指针ptr,并通过ptr去修改num的值

#include<stdio.h>
void main() {
	int num = 97;
	int* ptr = &num;
	printf("int类型的变量num的地址为%p\n", ptr);
	*ptr = 7;
	printf("修改后的num的值为%d", num);

}

 1.8值传递和地址传递(指针传递)

1.8.1值传递和地址传递的类型

  1. 默认传递值的类型:基本数据类型 (整型类型、小数类型,字符类型),结构体,共用体
  2. 默认传递地址的类似:指针,数组

1.8.2值传递

值传递是将某一地址空间的内容(变量)复制到另一地址空间。

#include<stdio.h>
void main() {
	int a1 = 97;
	int a2 = a1;
	printf("a2 = %d", a2);
}

1.8.3指针传递

指针传递是将某一地址空间的地址存在另一地址空间中

#include<stdio.h>
void main() {
	int a = 97;
	int* b = &a;//指针b指向a的地址空间
	int* c = b;//指针c的内容为指针b的内容,即指针b和指针c都指向a的地址空间
	printf("a的内容为%d\tb的内容为%p\tc的内容为%p\n", a, b, c);

	*c = 7;//改变指针c指向的地址空间的内容,即a的内容,则a本身也会改变
	printf("a的内容为%d\tb的内容为%p\tc的内容为%p\n", a, b, c);
}

举例:值传递就是我和你都有100块,你花多少与我无关;指针传递就是我和你公用100块,你用或者我用都会使得这100块改变。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值