【C语言从入门到入土】第六章 指针(上)

2024-06-09 11:36

本文主要是介绍【C语言从入门到入土】第六章 指针(上),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第六章 指针

都说指针是C语言里面最难的,今天我倒要看看到底有多难,哈哈哈哈,很恭喜你闯到了这一关,至于最后的结果如何,咱们拭目以待

文章目录

    • 第六章 指针
      • 1.认识一下指针
      • 2.指针变量 = 存放地址的变量
        • 2.1如何定义一个指针变量以及如何使用指针变量
        • 2..2变量的访问方式
        • 2.3既然指针变量是存放别人地址的变量,那什么要区分类型呢
      • 3.我们为什么要用指针
        • 3.1封装函数,实现两个数的交换
        • 3.2指针指向固定的区域

1.认识一下指针

1.指针 == 地址;访问变量的两种方式:1.变量名 ,2.地址

int a = 10;
类型 变量名 内存地址 值
//这样我们就引出来了,指针1.变量名能访问2.通过地址也能访问   & 取地址运算符   * 将地址内的值读出运算符
/*****************************************************************************************************************/
#include <stdio.h>
int main()
{int a = 10;printf("a的数值为%d\n",a);printf("a的地址为%p\n",&a);printf("a的数值为%d\n",*(&a));// * 是取值运算符,它可以把地址里面的数据来取出来//这个就是另外一种通过地址来取出来数值的方式return 0;
}

这个图怎么看??? 1.首先这个 3 是被一个变量 i 给存着,他的地址是 2000 2.而下面有一个存放着地址 2000(变量i的地址)的变量i_pointer,而这个变量本身又有一个自身的地址 3020

在这里插入图片描述

2.指针变量 = 存放地址的变量

2.1如何定义一个指针变量以及如何使用指针变量
  • ​ * 的运算作用
#include <stdio.h>
int main()
{//什么是整形变量,存放整型数的变量//什么是字符变量,存放字符型的变量//什么是指针变量,存放指针的变量//什么是指针变量,存放地址的变量int a = 10;int *p; //这里的*是一个标识符,告诉系统我是一个指针变量,是用来保存别人地址的,和下方的运算符不同p = &a;//int *p = &a;printf("变量名访问a:%d\n",a);printf("地址访问a:%d\n",*(&a));//取值运算符,把a地址存放的数值来取出来printf("a的地址是a:0x%p\n",&a);printf("变量名访问a:%d\n",a);retrun 0;
}
2…2变量的访问方式

在这里插入图片描述

2.3既然指针变量是存放别人地址的变量,那什么要区分类型呢

他的类型决定了,你指向(开辟)的空间大小,也决定了他的增量大小

#include <stdio.h>
int main()
{int a =0x1234;int *p = &a;char *c = &a;//会有一个警告,我们不需要管printf("p=%p\n",p);printf("pc=%p\n",c);printf("p=%x\n",*p);printf("c=%x\n",*c);//取值运算符会根据指针变量类型,访问不同大小的空间printf("++p= %p\n",++p);printf("++c = %p\n",++c);return 0;
}

在这里插入图片描述

这里我们看见,整型与字符型的区别,整型的偏移一个增加了4个字节,而字符增加了1个字节,且字符型在取值上面也出现了问题————(1个字节为8位)

3.我们为什么要用指针

3.1封装函数,实现两个数的交换
  1. 图一,传统我们交换数据的方式是,定义一个临时变量来承接,实现交换
  2. 图二,而如果我们直接是封装一个函数来进行数据传递的话,封装的函数会另外开辟出来一个地址空间(在调用函数完毕这个空间会被释放),我们通过主函数把数值传递给封装的函数,在封装函数里面完成了数值的交换,但是主函数里面的数据并没有发生任何的变化。
  3. 图三,我们通过指针直接把数据的地址传递过去,修改地址的数据,从而就可以改变主函数的值,这就是用指针的好处

在这里插入图片描述

回顾一下之前的

//已经验证没有问题
#include <stdio.h>
int main()
{int a =5;int b =10;int tmp;printf("交换前a =%d,b =%d\n",a,b);tmp =   a;a   =   b;b   = tmp;printf("交换后a =%d,b =%d\n",a,b);return 0;
}

函数封装错误的方式

#include <stdio.h>
void change(int a,int b)
{int tmp;tmp =   a;a   =   b;b   = tmp;
}
int main()
{int a =5;int b =10;printf("交换前a =%d,b =%d\n",a,b);change(a,b);printf("交换后a =%d,b =%d\n",a,b);return 0;
}

换了个寂寞哈哈哈哈哈

在这里插入图片描述

正确的方式

p (&a)就是存放的变量的地址 *p存放变量的地址,这个地址里面的内容是什么, &p 这个指针变量自己的一个地址

#include <stdio.h>
void change(int *a,int *b)//定义一个指针变量来承接
{int tmp;tmp =   *a;//这里我一开始用成了取地址的a,*a的意思是取值,不是指针变量的意思*a   =   *b;//而且你上面定义的就是指针变量,你怎么能用取地址呢???*b   = tmp;
}
int main()
{int a =5;int b =10;printf("交换前a =%d,b =%d\n",a,b);change(&a,&b);//把a,b的地址给传过去printf("交换后a =%d,b =%d\n",a,b);return 0;
}

在这里插入图片描述

3.2指针指向固定的区域

单片机 armbootloader(寄存器配置)

//回顾一下
#include <stdio.h>
int main()
{int a =10;printf("address of a is 0x%p\n ",&a); return 0;
}

在这里插入图片描述

#include <stdio.h>
int main()
{int a =10;printf("address of a is %p\n ",&a);//指向一个固定的地址int *p = (int *)0x000000000061FE11;//0x不能少//升华一下//1.无符号整形数 unsigned int *p = (unsigned int *)0x000000000061FE11;//2.这个是防止编译器认为这个地址不好然后给我们优化到别的地址,做的一项操作//volatile unsigned int *p = (volatile unsigned int *)0x000000000061FE11;printf("address of p is %p\n",p);return 0;
}

这篇关于【C语言从入门到入土】第六章 指针(上)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

解决java.lang.NullPointerException问题(空指针异常)

《解决java.lang.NullPointerException问题(空指针异常)》本文详细介绍了Java中的NullPointerException异常及其常见原因,包括对象引用为null、数组元... 目录Java.lang.NullPointerException(空指针异常)NullPointer

使用Go语言开发一个命令行文件管理工具

《使用Go语言开发一个命令行文件管理工具》这篇文章主要为大家详细介绍了如何使用Go语言开发一款命令行文件管理工具,支持批量重命名,删除,创建,移动文件,需要的小伙伴可以了解下... 目录一、工具功能一览二、核心代码解析1. 主程序结构2. 批量重命名3. 批量删除4. 创建文件/目录5. 批量移动三、如何安

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要

C语言中自动与强制转换全解析

《C语言中自动与强制转换全解析》在编写C程序时,类型转换是确保数据正确性和一致性的关键环节,无论是隐式转换还是显式转换,都各有特点和应用场景,本文将详细探讨C语言中的类型转换机制,帮助您更好地理解并在... 目录类型转换的重要性自动类型转换(隐式转换)强制类型转换(显式转换)常见错误与注意事项总结与建议类型

Go语言利用泛型封装常见的Map操作

《Go语言利用泛型封装常见的Map操作》Go语言在1.18版本中引入了泛型,这是Go语言发展的一个重要里程碑,它极大地增强了语言的表达能力和灵活性,本文将通过泛型实现封装常见的Map操作,感... 目录什么是泛型泛型解决了什么问题Go泛型基于泛型的常见Map操作代码合集总结什么是泛型泛型是一种编程范式,允

Android kotlin语言实现删除文件的解决方案

《Androidkotlin语言实现删除文件的解决方案》:本文主要介绍Androidkotlin语言实现删除文件的解决方案,在项目开发过程中,尤其是需要跨平台协作的项目,那么删除用户指定的文件的... 目录一、前言二、适用环境三、模板内容1.权限申请2.Activity中的模板一、前言在项目开发过程中,尤

C语言小项目实战之通讯录功能

《C语言小项目实战之通讯录功能》:本文主要介绍如何设计和实现一个简单的通讯录管理系统,包括联系人信息的存储、增加、删除、查找、修改和排序等功能,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录功能介绍:添加联系人模块显示联系人模块删除联系人模块查找联系人模块修改联系人模块排序联系人模块源代码如下

基于Go语言实现一个压测工具

《基于Go语言实现一个压测工具》这篇文章主要为大家详细介绍了基于Go语言实现一个简单的压测工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录整体架构通用数据处理模块Http请求响应数据处理Curl参数解析处理客户端模块Http客户端处理Grpc客户端处理Websocket客户端

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3