网站建设 上海网站网站建设常用模板
- 作者: 五速梦信息网
- 时间: 2026年04月20日 07:54
当前位置: 首页 > news >正文
网站建设 上海网站,网站建设常用模板,小程序定制语言,厦门手机网站建设公司哪家好前言 指针可以说是C语言基础语法中最难的理解的知识之一#xff0c;很多新手#xff08;包括我#xff09;刚接触指针时都觉得很难。在我之前发布的笔记中都穿插运用了指针#xff0c;但是我一直没有专门出一期指针的笔记#xff0c;这是因为我确实还有些细节至今还不太清… 前言 指针可以说是C语言基础语法中最难的理解的知识之一很多新手包括我刚接触指针时都觉得很难。在我之前发布的笔记中都穿插运用了指针但是我一直没有专门出一期指针的笔记这是因为我确实还有些细节至今还不太清楚。本篇将分享我对指针的理解欢迎各位大佬批评指正。 一、指针是什么 我们平常所说的指针其实就是指针变量是一种用来存放地址的变量。地址就是某一变量或函数的地址当我们需要调用某一变量或函数时可以通过该变量或函数的地址找到并调用。因此当指针变量中存放了一个变量的地址时我们就可以通过该指针找到其所指向的变量。 就像在现实当中我们知道一个朋友家的地址才能找到这个朋友的家。 在32位系统上所有指针变量的大小均为4字节。在64位系统上为8字节。 二、常见的指针类型 常见指针类型可以和常见的数据类型一一对应例如整型指针对应整型浮点型指针对应浮点型。需要注意的是结构体变量的数据类型为“struct 结构体名”定义结构体指针时需要将类型写全。 int* pi NULL; //整型指针 char* pch NULL; //字符型指针 float* pf NULL; //単精度浮点型指针 double* plf NULL; //双精度浮点型指针 sturct stru* ps NULL; //结构体指针 FILE* pF NULL;//文件指针 void (test)() ptest NULL; //函数指针 上图即各种常见的指针类型的定义方式例如 pi 为 int 类型的指针变量pi的数据类型为 int* 即整型指针、 ps 为 struct stru* 类型的指针即该结构体类型的指针而 ptest 为 void (*)() 类型的函数指针。 图中的所有的指针均被初始化为NULL。NULL为空指针其数值为0。 三、野指针 野指针就是指向未知地址的指针。 当我们定义了一个指针变量后如果不直接初始化为所需存放的地址则应初始化为空指针NULL。否则该指针将会成为野指针。 野指针有什么危害呢当我们创建一个变量时编译器会向内存申请一块空间来存放该变量这块空间为合法空间我们使用指针访问该空间即为合法访问。而野指针指向的随机地址可能并非合法空间当我们使用野指针时就会产生非法访问。 因此当我们创建一个指针变量后如果不要立即使用则最好将其初始化为空指针以避免造成非法访问。 四、指针的基本用法
- 指针的赋值和解引用 当我们创建一个指针变量后我们应该如何使用该指针变量来存储一个对应数据类型的数据呢又该如何使用该指针来找到其所指向的数据呢这里以整型指针为例。我们来看看以下代码printf函数的打印值为多少呢 int main() {int a 10;int* pa a;int b *pa;printf(%d\n,b);return 0; } 首先介绍一下上方代码出现的两种操作符 1、取地址操作符 用来取出变量的地址例如a的值就是a的地址。 2、解引用操作符 * 用来解引用指针变量使用指针所指向的数据例如pa的值即为a的值。这里需要注意区分 int 中的 * 和解引用操作符 * 前者 int* 为一个整体代表一种数据类型而后者为一种操作符。 我们来逐条分析上方代码。 第一行定义变量a并初始化为10。第二行定义指针变量pa并初始化为a的地址。第三行定义变量b并初始化为pa所指向的变量即b被初始化为10。因此printf函数打印的值为10。 2. 函数传参 函数传参分为传值调用和传址调用两种。传值调用指直接将变量传给函数而传址调用则是将变量的地址传给函数。这里我通过一个简单的函数来介绍这两种传参方式的区别。 2.1 传值调用 如图为一段传值调用的代码我们将x初始化为0并将x10作为参数xy传入test函数在test函数中x被赋值为y那么为什么最后printf函数打印出来的x值为0呢 首先我们要明白一点main函数中的x与test函数中的x不是同一个变量因此test函数中的x被赋值为10并不会影响main函数中的x的值main函数中的x也就还是0。 如果我们希望使用传值调用实现上述逻辑应对代码进行如下修改。 通过函数返回值的方式对main函数中的x进行赋值即可。 2.2 传址调用 这段代码与传值调用的第一段代码类似将test函数参数中的(int)x换成了(int)px。在test函数中通过解引用px的方式找到x并进行赋值操作这样操作又可以实现上述逻辑这是为什么呢 首先我们要搞清楚一点每个变量被创建出来时都会占用一部分内存空间在该变量被销毁之前其占用的空间是不变的。当我们拥有该变量的地址时我们可以在它未被销毁的任何位置通过其地址找到该变量。 在上面这段代码中main函数中的x在main函数结束时才被销毁那么在main函数调用test函数时x并未被销毁因此在test函数中我们可以通过x的地址px找到并给x赋值。 2.3 用法总结 传值调用和传址调用不分绝对的好坏需要根据实际情况选用不同的方式。 当不需要改变参数值只需要调用参数参与函数运算时多使用传值调用。 当需要改变参数值时多使用传址调用。 五、指针运算 指针运算的知识多用于与数组结合的问题。 1. 指针 (-) 整数 这段代码分别打印了p-1、p和p1地址的格式符为%p打印值为十六进制。我们可以发现指针通过加减整数得到的值仍然为指针。 在此图中指针1地址4。这是因为图中的指针为整型指针(int)一个整型的大小为4个字节指针1的含义是跳过一个整型也就是跳过4个字节即地址4。同理如果是一个字符指针(char)1则跳过一个字节地址1如果是双精度浮点型指针(double)1则跳过八个字节地址8。 2. 指针 - 指针 根据上述指针(-)整数的知识我们可以推出指针-指针的值应该为整数。 这里我通过字符指针为例字符指针每次1跳过一个字节更加直观。上图中pa为低地址pb为高地址差值为32。pa-pb为低地址-高地址结果为负的差值即-32同理pb-pa则为32。 六、二级指针 我们知道一个整型指针(int)可以存储一个整型(int)变量的地址。那么作为一个指针变量我们同样可以使用一个指针来存储它的地址。 我们来逐一分析上方代码。首先pa为指向a的指针它的类型为整型指针(int)而ppa为指向pa的指针它的类型为整型指针指针(int**)。这就是所谓的二级指针。我们同样可以通过二级指针找到最终的变量值。首先进行一次解引用找到其所指向的一级指针再次解引用即可得到变量值如图中 **ppa 。 当然有二级指针同样也有三级四级甚至更高级数的指针它们的底层逻辑与二级指针相同这里就不过多解释了。 结束语 以上就是有关于指针的基础内容了希望能够帮助到正在学习C语言的同学们。如果文章内容有错误或知识点有遗漏望各位大佬批评或补充在评论区或私信。
- 上一篇: 网站建设 商城wordpress哪些文件需要给777
- 下一篇: 网站建设 摄影服务厦门建设局林德志
相关文章
-
网站建设 商城wordpress哪些文件需要给777
网站建设 商城wordpress哪些文件需要给777
- 技术栈
- 2026年04月20日
-
网站建设 锐颖科技公司网站开发项目外包方案
网站建设 锐颖科技公司网站开发项目外包方案
- 技术栈
- 2026年04月20日
-
网站建设 软文发布南宁百度seo
网站建设 软文发布南宁百度seo
- 技术栈
- 2026年04月20日
-
网站建设 摄影服务厦门建设局林德志
网站建设 摄影服务厦门建设局林德志
- 技术栈
- 2026年04月20日
-
网站建设 深圳宝安建设网站西丽
网站建设 深圳宝安建设网站西丽
- 技术栈
- 2026年04月20日
-
网站建设 事项seo网站推广杭州
网站建设 事项seo网站推广杭州
- 技术栈
- 2026年04月20日
