初识C语言(四)

简介: 初识C语言(四)

1.指针

要学习指针,就得理解内存  指针就是用来访问内存的

內存

內存是电脑上特别重要的存取器,计算机中程序的运行都是在内存中进行的

所以为了有效的使用内存,就把内存划分为一个个小小的内存单元,每个内存单元的大小是1个字节

为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的的地址

在C语言中 地址编号也是叫指针    编号 == 地址 == 指针  三个表达的意思相同


编号


在计算机上,有地址线,也就是物理的电线

可传递高低电平的信号,转换为数字信号:高电平为1,低电平为0。所以计算机采用2进制,每个信号(1/0)是一个二进制位,也就是bit位

32位计算机,上面有32根地址线,每个地址线会传递一个数字信号,所以会产生2的32次方个不同的信号编号,这些编号可以管理2的32次方个字节,4GB的内存,就是可以为每个字节进行编号,可以通过编号找到他们在内存中的位置。我想肯定会有人问,为什么以字节为单位编号,那是因为我们所学的数据类型中char字符型所占内存最小,为一个字节,所以字节为单位最好。

现在计算机一般是64位,这样可以管理更多的内存。


1.1 指针的使用:

//程序运行起来,要加载到内存中,也要申请内存空间使用
int main()
{
  int a = 15;//a是int类型
  //所以向内存中申请了4个字节的空间 来存放15这个数值
  //虽然a占用4个字节,但我们&a的时候,拿到的是4个字节中的的第一个字节的地址
  //%p - 专门用来打印地址的,是16进制的形式表示地址的
  printf("%p", &a);//&取地址符,拿到a的地址
  int* pa = &a;//pa用来存放a的地址,是一个变量,叫指针变量  意思是存放指针的变量
  // * 是为了表示 pa 是一个指针变量
  //int 是为了表示 pa 指向的是 int 类型的变量
  //可以通过地址找到a
  *pa = 30;// * 解引用操作符,*pa就是a
  printf("%d\n", a);//打印30;
  //提供了另一种方式对a进行操作
  return 0;
}


指针 - 地址 - 编号  三个意思相同

指针变量 - 是一个变量 - 就是存放地址的变量

口头语中说的指针,基本上都是指针变量。


1.2 指针变量的大小

指针变量是用来存放地址的

32位机器:地址是32个2进制位,也就是32个bit位,1个字节8个bit位,所以这个地址要存储的话要4个字节。所以在32个机器上,指针变量的大小是4个字节

64位机器:64个2进制位,这个地址要存储的话要8个字节。


所以,指针变量的大小与它指向的数据的类型是没有关系的,它的大小只与操作系统的位数有关。


int main()
{
  int a = 10;
  int* p = &a;
  printf("%d\n", sizeof(p));//32 4个字节   64位  8个字节
  printf("%d\n", sizeof(int*));//32 4个字节   64位  8个字节
  return 0;
}


在VS2022编译器上,可以自己改变编译环境位数。x64位64位环境,指针变量大小为8个字节。x86为32位环境,指针变量大小为4个字节。

2.结构体

char short int 等数据类型是比较单一的

不足以描述一些复杂类型,如学生,书

学生 :名字 年龄 性别等

书  : 书名 作者 定价

C语言中引入了结构体描述复杂对象   使用关键字struct


2.1结构体的使用和结构体变量的创建

//学生 结构体
struct Student//Student为结构体名称,可以随意设置
{
  //学生的相关属性   结构体成员
  char name[20];//名字—字符串  ,一个汉字是2个字符
  int age;//年龄
  char sex[5];//男 女 保密     数组长度[5]是因为保密4个字符 \0一个字符
};
//书 结构体
struct Book
{
  //结构体成员
  char name[20];
  char auther[10];
  float price;
};
int main()
{
    //创建结构体变量s   struct Student为结构体类型
  struct Student s = {"西兰花",19,"男"};//s 学生结构体变量
  struct Book b = { "《初识C语言》","西兰花",66.6f };//b 书结构体变量
  //.操作符 通过结构体变量访问结构体成员
  printf("%s %d %s\n", s.name, s.age, s.sex);
  printf("%s %s %f\n", b.name, b.auther, b.price);
  //这里价格浮点型数据,会精度丢失,不能准确打印,后期会讲
}


2.2结构体指针

struct S//S结构体类型
{
  char name[20];
  int age;
  float score;
};
void print1(struct S t)
{
  //第一种访问结构体成员写法
  //语法:  结构体变量.成员
  printf("%s\n%d\n%.2f\n", t.name,t.age,t.score);
}
void print2(struct S* ps)
{
  //第二种访问结构体成员写法
  //语法:  结构体变量.成员     与第一种相同,解引用结构体指针得到的也是结构体变量,
  printf("%s\n%d\n%.2f\n", (*ps).name, (*ps).age, (*ps).score);//.的优先级比 * 高,所以加()
  //第三种访问结构体成员写法
  //语法:  结构体指针->成员
  printf("%s\n%d\n%.2f\n", ps->name, ps->age, ps->score);//->
}
int main()//先执行main函数
{
    //创建结构体变量
  struct S s = { "是个西兰花",20,99.9f };
  print1(s);//调用自己编写输出函数
  print2(&s);//这里传入的是结构体变量的地址,&s,取出s的地址
  return 0;
}


初识C语言系列结束,后面文章会对每个模块进行详细讲解,谢谢大家支持。

相关文章
|
Java 中间件 测试技术
java依赖冲突解决问题之jar包版本冲突无法通过升降级解决时如何解决
java依赖冲突解决问题之jar包版本冲突无法通过升降级解决时如何解决
|
10月前
|
SQL 监控 关系型数据库
MySQL如何查看每个分区的数据量
通过本文的介绍,您可以使用MySQL的 `INFORMATION_SCHEMA`查询每个分区的数据量。了解分区数据量对数据库优化和管理具有重要意义,可以帮助您优化查询性能、平衡数据负载和监控数据库健康状况。希望本文对您在MySQL分区管理和性能优化方面有所帮助。
988 1
|
前端开发 JavaScript 安全
2023 年的 10 个前端趋势
2023 年的 10 个前端趋势
417 1
|
存储 监控 API
【云原生系列】云计算概念与架构设计介绍
**云计算**是基于互联网的计算模式,通过共享计算资源(如服务器、存储、应用程序)提供高效、可扩展、可靠、安全和经济的服务。其架构通常包括**物理层**(服务器、存储、网络设备等基础设施)、**虚拟化层**(虚拟机、容器、虚拟网络等)、**平台层**(开发、运行时、数据库服务等)和**应用层**(企业应用、Web应用、移动应用)。云计算服务有IaaS、PaaS和SaaS,广泛应用于企业IT、开发测试、大数据处理、AI和远程办公等领域。为了确保性能和可靠性,云平台采用负载均衡、自动伸缩、备份恢复、安全措施和监控故障排除等方法。
933 1
|
人工智能
从观看《长安三万里》有感,动手基于SD生成山水图
最近,我尝试使用stable diffusion来生成一幅山水画,灵感来自动漫《长安三万里》。这幅画的背景是一个美丽的山水风景,有着连绵起伏的山脉、宁静的湖泊和繁华的城市。在这个背景中,我想要表达出一种深沉的情感,让人们可以感受到这个世界的壮丽和美丽。
1957 21
|
存储 Kubernetes 调度
【k8s概念】一文搞懂k8s核心概念!!!(上)
【k8s概念】一文搞懂k8s核心概念!!!(上)
970 0
|
Java
Typora字体颜色设置:一键替换MD文件的字体样式
Typora字体颜色设置:一键替换MD文件的字体样式
600 0
|
前端开发 JavaScript
JavaScript判空设默认值的几种写法
JavaScript判空设默认值的几种写法
340 0
|
算法 Java Maven
关于OptaPlanner的使用(三)——运行代码案例
关于OptaPlanner的使用(三)——运行代码案例
519 0
|
Java API 开发工具
Magisk 最新版本 V24.1 源码编译踩坑集锦
Magisk 最新版本 V24.1 源码编译踩坑集锦
935 0