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块改变。


相关文章
|
2月前
|
存储 C语言
C语言数据类型、变量和运算符以及printf相关问题
C语言数据类型、变量和运算符以及printf相关问题
|
2天前
|
存储 C语言
【c语言】数据类型和变量
本文介绍了C语言中的数据类型和变量。数据类型分为内置类型和自定义类型,内置类型包括字符型、整型、浮点型等,每种类型有不同的内存大小和取值范围。变量分为全局变量和局部变量,它们在内存中的存储位置也有所不同,分别位于静态区和栈区。通过示例代码和图解,详细阐述了这些概念及其应用。
21 1
|
5天前
|
存储 C语言
C语言指针与指针变量的区别指针
指针是C语言中的重要概念,用于存储内存地址。指针变量是一种特殊的变量,用于存放其他变量的内存地址,通过指针可以间接访问和修改该变量的值。指针与指针变量的主要区别在于:指针是一个泛指的概念,而指针变量是具体的实现形式。
|
13天前
|
存储 C语言
C语言:设置地址为 0x67a9 的整型变量的值为 0xaa66
在C语言中,可以通过指针操作来实现对特定地址的访问和赋值。要将地址为 0x67a9 的整型变量值设为 0xaa66,可以先定义一个指向该地址的指针,并通过该指针对该内存位置进行赋值操作。需要注意的是,直接操作内存地址具有一定风险,必须确保地址合法且可写。代码示例应考虑字节序及内存对齐问题。
|
13天前
|
C语言
C语言学习笔记-知识点总结上
C语言学习笔记-知识点总结上
56 1
|
19天前
|
C语言 C++
【C语言】指针篇-一篇搞定不同类型指针变量-必读指南(3/5)
【C语言】指针篇-一篇搞定不同类型指针变量-必读指南(3/5)
|
12天前
|
存储 C语言
初识C语言:常量与变量中寻找数据类型
初识C语言:常量与变量中寻找数据类型
|
1月前
|
存储 C语言
【C语言基础考研向】02 数据类型-常量-变量
本文介绍了编程中的基本概念,包括数据类型分类、常量与变量的定义及使用。首先概述了四大类数据类型:基本类型(整型、浮点、字符型)、构造类型(数组、结构体)、指针类型和空类型。接着阐述了常量与变量的区别及命名规则,并详细说明了整型、浮点型和字符型数据的特点与应用。最后总结了常见的易错点,如字符串与字符常量的区别及浮点数的默认输出格式。
|
17天前
|
C语言 C++
实现两个变量值的互换[C语言和C++的区别]
实现两个变量值的互换[C语言和C++的区别]
14 0
|
1月前
|
存储 传感器 物联网
结合物联网开发探讨C语言的变量
在物联网(IoT)开发中,C语言的变量起着至关重要的作用。由于物联网设备资源有限,C语言的高效性和对硬件的直接控制使其成为开发嵌入式系统的首选。