C语言学习笔记——变量(下)

简介: C语言学习笔记——变量

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);
}

fe99cb0451ff4f01814a4b51bd2ce77c.png

#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);
}

106e71fe4f684b31a0896be19315914a.png

#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);
}

00133c377c63466b94d2c683f82618e3.png

  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);
}

d94e951790d24b728f86acd53235ba96.png

7d0d56d8641141d2babffe58e0373f60.jpg

  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);
}

b1dcf1c5031744b3a7bcbfecefdbea2c.png

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);
}

712a1c02a84a44799ba4c60429183971.png

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);
}

d44b8a0c5e0d435ba955b385d67687eb.png

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


相关文章
|
4天前
|
存储 编译器 C语言
C语言3 变量
C语言3 变量
5 1
|
14天前
|
C语言
C语言15---在VC中变量的注意点和变量的注意细节
C语言15---在VC中变量的注意点和变量的注意细节
|
22天前
|
C语言
C语言学习笔记之初识字符串
C语言学习笔记之初识字符串
25 5
|
21天前
|
存储 编译器 C语言
C语言数据类型和变量(二)
C语言数据类型和变量(二)
|
21天前
|
存储 编译器 C语言
C语言数据类型和变量(一)
C语言数据类型和变量(一)
|
23天前
|
C语言
【C语言】:详解函数指针变量,函数指针数组及转移表
【C语言】:详解函数指针变量,函数指针数组及转移表
19 2
|
12天前
|
C语言
|
12天前
|
C语言
|
12天前
|
C语言
C语言学习笔记-W3
w3 条件,循环和数组
7 0
|
14天前
|
C语言
C语言16---变量的注意细节
C语言16---变量的注意细节