(学习记录)C 0004——简单的了解C语言

2024-04-13 10:08

本文主要是介绍(学习记录)C 0004——简单的了解C语言,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

从0开始的的C语言

  • 简单的了解指针
    • 内存
    • 指针变量
    • * 解引用操作符
    • 指针变量所占的空间
  • 简单的了解结构体

简单的了解指针

学习指针前,我们必须先要了解内存


内存

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

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

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

如图:
内存条

变量都有地址,取出变量的地址如下:

int main()
{int a = 10;//向内存申请4个字节的空间,里边存放10//%p 按照地址的方式来打印printf("%p\n", &a);//&——取地址操作符return 0;
}

F10调试,调出内存窗口输入&a,如图:
在这里插入图片描述
在0x0040F874中,因为0a的十六进制表示为10,所以0x0040F874存储的是0a。

0x0040F874所占的4个字节的空间,就是变量a所占的空间。

因为地址是连续的,0a的地址是74 ,所以0a后面的00的地址就是75,再往后就是76和77。

打印得到的地址是四个字节地址中,编号最小的地址。

每次调试,系统分配的地址都会有所不同。

地址就是指针,指针就是地址。


指针变量

将&a的地址存放到pa中,pa是一个存放地址变量,这样的变量被称为指针变量

指针变量的写法是int* pa = &a;pa 存放的变量a的地址,也就是说pa指向了变量a,因为变量a定义的是int, 所以pa的类型也是int。

如图:

int main()
{int a = 10;int* pa = &a;char ch = 'w';char* pc = &ch;return 0;
}

* 解引用操作符

int main()
{int a = 10;int* pa = &a;*pa = 20;printf("%d\n", a);return 0;
}

*pa的意思是,通过pa存的呢个地址,去找到它所指向的那块空间a。

如果*pa = 20;呢么a的值是否改变呢?

运行后
运行结果
如图,所以*pa所代表的意思就是变量a。


指针变量所占的空间

int main()
{printf("%zu\n", sizeof(char*));printf("%zu\n", sizeof(short*));printf("%zu\n", sizeof(int*));printf("%zu\n", sizeof(long*));printf("%zu\n", sizeof(float*));printf("%zu\n", sizeof(double*));return 0;
}

运行结果是:
运行结果
如图,每种类型都是4个字节空间。

原因是在32位机器上,有32根地址线,每个地址线由二进制数组成,所以有32个0/1组成,也就是32个bit位,32个bit位 等于 4 字节。

因此,64位就有8个字节空间大小。


简单的了解结构体

当描述一个复杂对象时,不能用一个简单的变量描述。
所以C语言提供了一个方式,用来描述这些复杂对象,这个方式就是结构体

比如,描述一个学生,用到的信息有名字,年龄,性别,学号等。描述一本书,书名、价格、作者。

//声明学生类型
struct Student
{char name[20];int age;char sex[5];char id[12];
};
struct Book
{char name[20];int price;char author[20];
};
int main()
{//创建的结构体变量struct Student s1 = {"张三",20,"男","20200506"};struct Student s2 = {"lisi",30,"女","20200908"};struct Book b1 = {"C语言程序设计",55,"谭浩强"};//打印
//.操作符 用法是:结构体变量.成员名printf("名字:%s\n年龄:%d\n性别:%s\n学号:%s\n", s1.name,s1.age,s1.sex,s1.id);printf("%s %d %s\n", b1.name, b1.price, b1.author);//指针struct Book* pb = &b1;printf("%s %d %s\n", (*pb).name, (*pb).price, (*pb).author);
//-> 用法是:结构体指针->成员名printf("%s %d %s\n", pb->name, pb->price, pb->author);return 0;
}

运行结果为:
运行结果


这篇关于(学习记录)C 0004——简单的了解C语言的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/899842

相关文章

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要

springboot简单集成Security配置的教程

《springboot简单集成Security配置的教程》:本文主要介绍springboot简单集成Security配置的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录集成Security安全框架引入依赖编写配置类WebSecurityConfig(自定义资源权限规则

MySQL INSERT语句实现当记录不存在时插入的几种方法

《MySQLINSERT语句实现当记录不存在时插入的几种方法》MySQL的INSERT语句是用于向数据库表中插入新记录的关键命令,下面:本文主要介绍MySQLINSERT语句实现当记录不存在时... 目录使用 INSERT IGNORE使用 ON DUPLICATE KEY UPDATE使用 REPLACE

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

C语言中的数据类型强制转换

《C语言中的数据类型强制转换》:本文主要介绍C语言中的数据类型强制转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C语言数据类型强制转换自动转换强制转换类型总结C语言数据类型强制转换强制类型转换:是通过类型转换运算来实现的,主要的数据类型转换分为自动转换

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

C语言实现两个变量值交换的三种方式

《C语言实现两个变量值交换的三种方式》两个变量值的交换是编程中最常见的问题之一,以下将介绍三种变量的交换方式,其中第一种方式是最常用也是最实用的,后两种方式一般只在特殊限制下使用,需要的朋友可以参考下... 目录1.使用临时变量(推荐)2.相加和相减的方式(值较大时可能丢失数据)3.按位异或运算1.使用临时