【C】Pointer

news2024/12/27 18:10:59

在这里插入图片描述

系列连载

  • 【python / C / C++】

参考

  • 《C语言程序设计(第四版)谭浩强》
  • 【C语言】C语言视频教程
  • 《郝斌 C 语言自学教程》

文章目录

  • 一、指针的重要性
  • 二、指针的定义
  • 三、指针的分类
    • 基本类型指针
    • 指针和一维数组
    • 指针和函数
    • 指针和结构体
    • 多级指针

int * p;

// p 是变量的名字,int * 表示 p 变量存放的是 int 类型变量的地址
// int * p 不表示定义了一个名字叫做 * p 的变量
// p 变量的数据类型是 int * 类型,所谓 int * 类型就是存放 int 变量地址的类型

int i = 3;
p = &i;

// p 保存了 i 的地址,因此 p 指向 i
// p 不是 i,i 也不是 p, 更准确的说:修改 p 的值不影响 i 的值,修改 i 的值不影响 p 的值
// 如果一个指针变量指向了某个普通变量,则 *指针变量 就完全等价于 普通变量,
//例子,如果 p 是个指针变量,并且 p 存放了普通变量 i 的地址,则 p 指向了普通变量; *p 就完全等价于 i,或者说在所有出现 *p 的地方都可以替换成 i
//*p(取值符) 就是以 p 的内容为地址的变量

在这里插入图片描述

p = &i
*p = i

一、指针的重要性

指针:

  • 表示一些复杂的数据结构
  • 快速的传递数据
  • 使函数返回一个以上的值
  • 能直接访问硬件
  • 能够方便处理字符串
  • 是理解面向对象语言中的基础

总结:

指针是 C 语言的灵魂

二、指针的定义

在这里插入图片描述
在这里插入图片描述
内存条一块地址,1 Byte = 8 bit
32 位一次读 4 个地址

地址:

  • 内存单元的编号
  • 从零开始的非负整数
  • 范围:4G(0~4G-1)

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

指针变量就是存放内存单元编号的变量,或者说指针变量就是存放地址的变量

指针和指针变量是两个不同概念,但是要注意,通常我们叙述时会把指针变量简称为指针,实际含义并不一样

指针的本质是一个操作受限的非负整数(不能加减除,只能减)

#include<stdio.h>

int main(){
	int* p;
	int i = 5;
	p = &i;
	//*p = i;
	printf("%d\n", *p);
	return 0;
}

output

5

上述代码如果用 *p = i 替换 p = &i, 则会出现垃圾地址,野指针

在这里插入图片描述
只分配没有释放( free) 就存在内存泄漏(越用越少)

多个指针指向同一块动态内存,free 一个就行,多次 free 就错了

三、指针的分类

基本类型指针

以交换 a 和 b 的值为例

#include<stdio.h>

void change1(int a, int b){
	int t;
	t = a;
	a = b;
	b = t;
	return;
}

int main(){
	int a = 3;
	int b = 5;
	change1(a, b);
	printf("a = %d, b = %d\n", a, b);
	return 0;
}

output

a = 3, b = 5

由于 c 语言的函数只能有一个返回值,所有 change1 中不能写成 return a,b

可以看到 change1 函数并不能互换 a 和 b 的值

下面试试利用指针

#include<stdio.h>

void change2(int* p, int* q){
	int* t;
	t = p;
	p = q;
	q = t;
	return;
}

int main(){
	int a = 3;
	int b = 5;
	change2(&a, &b);
	printf("a = %d, b = %d\n", a, b);
	return 0;
}

output

a = 3, b = 5

发现还是没能交换,因为只是改变了两个指针变量存放的地址,并没有改变 a 和 b 的值
在这里插入图片描述

#include<stdio.h>

void change3(int*, int*);

int main(){
	int a = 3;
	int b = 5;
	change3(&a, &b);
	printf("a = %d, b = %d\n", a, b);
	return 0;
}

void change3(int* p, int*q){
	int t;
	t = *p;
	*p = *q;
	*q = t;
	return;
}

output

a = 5, b = 3

指针和一维数组

指针和函数

指针和结构体

多级指针

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/426193.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CASS自带数据-绘制地形图

1、打开cass软件&#xff0c;如下图&#xff1a; 2、点击“绘图处理”菜单栏&#xff0c;选择“展野外测点点号”&#xff0c;如下&#xff1a; 3、在命令栏输入绘图比例尺&#xff0c;这里选择默认1:500&#xff0c;点击回车键进入下一步&#xff0c; 4、在弹出的窗口中&#…

单片机通过串口向电脑端发送数据电脑端发送数据控制led

上节课我们学习了串口的理论部分&#xff0c;这节课我们要来学习实操部分。 要想实现单片机通过串口向电脑端发送数据&#xff0c;我们首先要来配置寄存器。 1.配置SCON SCON寄存器中的SM0配置为0&#xff0c;SM1配置为1决定了串口工作在模式一&#xff0c;也就是8位UART&am…

前端透明分栏设计

目前在开发一个基于众包的打分网站&#xff0c;前端遇到的一个需求是&#xff1a; 背景是电影的海报&#xff0c;且不能随着scroll-bar滚动&#xff0c;需要一个蒙版分为两栏&#xff0c;左侧是影视的媒体信息&#xff0c;不随页面滚动右侧是影视的基本信息和评分信息&#xf…

如何使用基于GPT-4的Cursor编辑器提升开发效率

程序员最恨两件事情&#xff1a;一是别人代码不写文档&#xff0c;二是要让自己写文档。随着 GPT-4 的到来这些都不是问题了&#xff0c;顺带可能连程序员都解决了。。。 之前一直觉得 AI 生成的代码也就写个面试题的水平&#xff0c;小打小闹&#xff0c;现在时代可变了。Curs…

@Conditional四个较常用的派生注解总结

该内容是在学习SpringBoot底层的时候&#xff0c;看到SpringBoot的使用&#xff0c;所以这的做一个简单的总结方便以后复习。可能会有一些问题&#xff0c;还望指出共同学习 Conditional注解&#xff1a; 作用&#xff1a;按照一定的条件进行判断&#xff0c;在满足给定条件后…

如果采用密钥对的形式登录系统后,如何由普通用户切换到root用户

使用xshell工具 采用秘钥的方式进行登录 创建一个新用户并设置密码 切换到新用户之后 su root 想要切换成root用户的时候 输入密码提示 su:Authentication failure su&#xff1a;身份验证失败 使用秘钥之后是不能使用密码再进行登录 我去阿里云查了一下 有一个相同…

stable diffusion 安装xFormers 报错:Couldn‘t install open_clip.

一、No module ‘xformers’. Proceeding without it. 这是因为没有安装xformers导致的。 解决办法&#xff1a; 在webui-user.bat文件这添加一行&#xff1a; set COMMANDLINE_ARGS--xformers如下图所示&#xff1a; 试着点击webui-user.bat&#xff0c;看能否下载&#xff…

17:00面试,17:04就出来了 ,问的实在是太...

从外包出来&#xff0c;没想到算法死在另一家厂子 自从加入这家公司&#xff0c;每天都在加班&#xff0c;钱倒是给的不少&#xff0c;所以也就忍了。没想到8月一纸通知&#xff0c;所有人不许加班&#xff0c;薪资直降30%&#xff0c;顿时有吃不起饭的赶脚。 好在有个兄弟内推…

你具备抽离与封装的思想吗?

笔者最近思考了自己参与的分布式系统业务的架构小细节&#xff0c;虽然笔者每天做的是实现部分需求与业务&#xff0c;但是笔者还是拥有很多时间去读底层源码的&#xff0c;加之笔者自身的思考与实践demo的总结&#xff0c;笔者将在本篇文章中提出笔者自己对“抽离”与“封装”…

Nginx编译安装及配置文件详解

写在前面 Centos版本&#xff1a;Centos 7.6 - 64bit Nginx版本&#xff1a;1.20.2 一、什么是Nginx Nginx (engine x) 是一款轻量级的Web 服务器 、反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器。 二、Nginx用在哪些地方 2.1 静态资源服务 动静…

mkv视频文件怎么转成mp4,这3个方法很好用

对于那些电脑不是很精通的小伙伴来说&#xff0c; mkv视频文件怎么转成mp4&#xff1f;小编先来介绍一下mkv视频格式&#xff0c;mkv是一种开放标准的自由的容器和文件格式&#xff0c;是一种多媒体封装格式&#xff0c;能够在一个文件中容纳无限数量的视频、音频、图片或字幕轨…

MVCC底层原理

目录说明MVCC的底层原理隐藏字段undo logRead View说明 在被面试官问面试题的时候&#xff0c;首先它问了Mysql的事务的隔离级别有几种&#xff1f;默认是哪种&#xff1f;他们分别解决了什么问题&#xff1f; 我在一顿回答“巴巴巴巴。。。。”之后&#xff0c;它又继续问题…

追踪项目进展常用的衡量方法

作为项目管理活动&#xff0c;项目中的进度跟踪可以帮助你了解项目实时的完成状态。有了正确的方法、项目管理工具和指标&#xff0c;项目跟踪可以指导你的团队的行动&#xff0c;甚至在问题出现之前向你发出预警。 项目经理使用各种方法、工具和指标来跟踪进度。其中最常见的…

自然语言处理(Natural Language Processing,NLP)简要

自然语言处理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09;简要一、发展状况二、发展优势三、发展瓶颈四、具体研究方向五、自然语言处理工具六、未来发展方向自然语言处理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09;是计算机…

(原创)Flutter基础入门:各种常用容器类组件

前言 上篇博客主要讲了Flutter的Shape实现 Flutter基础入门&#xff1a;实现各种Shape效果 今天主要讲下Flutter中常用的一些容器组件 Flutter中组件数量很多&#xff0c;分类方式也各有不同 比如可以分为有态组价和无态组件 又可以分为容器组件、功能组件等 拿功能组件来说 有…

docker网络详解,自定义docker网络

文章目录一、初识docker网络1、docker0虚拟网桥2、docker网络常用基本命令3、docker网络可以解决的问题二、docker网络模式1、四种网络模式2、容器实例内默认网络IP生产规则3、bridge模式4、host模式5、none模式6、container模式五、自定义网络模式1、过时的docker link2、使用…

【英语】大学英语CET考试,词汇语法导学方法论笔记(50h+)

文章目录1、谭剑波-词汇直播课1-2&#xff08;词汇学习3个关键&#xff09;1.1 看不懂句子的原因&#xff08;词汇的重要性&#xff09;1.2 记不住单词的原因&#xff08;死记硬背70%&#xff09;1.3 理解单词的本质&#xff08;词根词缀&#xff0c;26字母&#xff0c;联想辅助…

D3D11和D3D12共享资源

最近碰到个伪需求: 游戏串流。 游戏引擎用D3D12渲染&#xff0c; 再把游戏画面做视频编码&#xff0c; 通过网络发送到远端做解码显示。 第一反应就是走全GPU的流程&#xff0c; 不要用CPU把显存里的数据拷来拷去。 所以先获取渲染完的D3D12的frame buffer&#xff0c; 然后送给…

进程管理 - 银行家算法

文章目录1 概述2 银行家算法2.1 原理2.2 例题1 概述 #mermaid-svg-7QKAqjQpckpStO9Q {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-7QKAqjQpckpStO9Q .error-icon{fill:#552222;}#mermaid-svg-7QKAqjQpckpStO9Q .e…

android framework-PackageManagerService(PKMS)包管理服务

一、概述 Android系统启动过程中&#xff0c;会启动一个包管理服务PackageManagerService(PKMS)&#xff0c;这个服务主要负责扫描系统中指定目录&#xff0c;找出里面以apk结尾的文件&#xff0c;通过对这些文件进行解析&#xff0c;得到应用程序的所有信息并完成应用程序的安…