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); }
- 强制数据转换是由大精度→小精度,且强制数据转换不改变原操作数的本身类型。如果不使用强制转换符,即(类型名)表达式,在大精度到小精度的转换过程中,则会出现warning,若使用则不会出现。
- 在强制转换过程中是直接截断小精度后的数字,而非四舍五入。
- 强制转换只对最近的操作数有效,若要对整个操作数进行强制转换,则需要把操作数放在括号内。
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); }
- 变量→变量地址→变量内容
- 输出变量的地址的格式为%p
- &p表示取出变量p对应的地址
- 指针的形式为数据类型*,int *指的是一个指针类型的变量
- 这个指针类型的变量的名字为ptr, ptr就是一个int *类型的变量
- ptr指向一个int类型的变量的地址
- 取出ptr的自身地址,&ptr下·
- 取出ptr存放的a1的地址,ptr
- 取出ptr指向的地址的内容,*ptr
- 指针的类型和它所指向的变量的类型需要一致
1.7.2指针练习
写一个程序,获取一个int变量num的地址,并显示到中断讲num的地址赋给指针ptr,并通过ptr去修改num的值
#include<stdio.h> void main() { int num = 97; int* ptr = # printf("int类型的变量num的地址为%p\n", ptr); *ptr = 7; printf("修改后的num的值为%d", num); }
1.8值传递和地址传递(指针传递)
1.8.1值传递和地址传递的类型
- 默认传递值的类型:基本数据类型 (整型类型、小数类型,字符类型),结构体,共用体
- 默认传递地址的类似:指针,数组
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块改变。