首页 > 其他分享 >关于C语言指针类型的总结

关于C语言指针类型的总结

时间:2024-10-24 22:58:52浏览次数:6  
标签:总结 文件 FILE int C语言 地址 数组 指针

前言

我个人将目前在C语言中所遇到的指针归类为8种,至于为何写第九点,是因为我个人认为第九点极容易与第五点混淆,故总结如下:

1.普通指针

普通指针即最常见的如:int * 、 char*等

甚至于也可将一个数组如arr[5]的数组名arr看作是指针类型(因为指针本质上就是地址,而arr 是该数组首元素的地址)

但是值得注意的是 sizeof (arr) 与&arr两种情况所代表的是整个数组的地址,首元素地址和整个数组地址在值上虽然相同,但在各自+1、-1操作所跨越的空间极为悬殊,前者+1只跳过一个元素,后者+1则是跳过整个数组。

2.野指针

野指针概念:指针指向的位置不可知(随机的、不正确的、没有明确限制的)

以下介绍几种野指针情况

①指针未初始化

#include <stdio.h>
int main()
{        
 int *p;//局部变量指针未初始化,默认为随机值

 *p = 20;
  return 0;
}

②指针越界访问

 #include <stdio.h>
 int main()
 {
   int arr[10] = {0}
   int *p = &arr[0];
   int i = 0;
 for(i=0; i<=11; i++)
 {
      //当指针指向的范围超出数组arr的范围时,p就是野指针
  *(p++) = i;
  }
   return 0;

③指针指向的空间释放

 #include <stdio.h>
 int* test()
 {
 int n = 100;
 return &n;
 }
 int main()
 {
 int*p = test();
 printf("%d\n", *p);
 return 0;
 }

出函数的时候变量n申请的空间会归还给操作系统
存在p中的地址没有指向的空间

3.无符号型指针(泛型指针)

无符号型指针即void * 型

void*可以用来接收任何类型的地址,这是其优点,但需要注意的是

void*类型的指针不能直接进行指针的+-整数的运算。

注:一般void*指针使用在函数参数部分,使得一个函数可以处理多种类型的数据,以实现泛型编 程的效果。

#include <stdio.h>
int main()
{
	int a = 10;
	void* pa = &a;
	void* pc = &a;
	*pa = 10;
 *pc = 0;
	return 0;
}

这里我们可以看到, void* 类型的指针可以接收不同类型的地址,但是无法直接进行指针运算。

4.二级指针

二级指针概念:存放一级指针地址的指针(本质上还是地址)

5bae1b6ecbe148a592835f38e1c12ab2.png bd855b8482154f0fafef103c3fecd5c6.png

至于是跳过4个还是8个字节取决于当前是几位的操作系统。

5.数组指针

数组指针概念:存放的是数组的地址,是能够指向数组的指针变量。

f65e6775e98d4d648dda6e85708869c5.png

上图p2就是数组指针变量,详细分析可见第8点。

数组指针的初始化:int(*p)[10] = &arr;

6.函数指针

函数指针概念:函数指针变量是⽤来存放函数地址的

函数名就是函数的地址,当然也可以通过 &函数名获得函数的地址,两者等价。**

bb01bd7ac33c480c9a2b187c6b9878ef.png

7.结构体指针

struct Test
{ int Num;
char *pcName;
short sDate;
char cha[2];
short sBa[4];
}*p = (struct Test*)0x100000;
2956534ec03e4f1e8e3acd36e1732c10.png

如图:P就是结构体指针变量(指向结构体)

注:p+1跳过的是一个结构体的大小。

8.文件指针

FILE pf; // 文件指针变量**

定义pf是⼀个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是⼀个结构体变 量)。通过该文件信息区中的信息就能够访问该文件。

即通过文件指针变量能够间接找到与它关联的文件。

至于FILE类型数据解释如下:

每个被使用的文件都在内存中开辟了⼀个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在⼀个结构体变量中的。该结构体类型是由系统声明的,取名FILE.

不同的C编译器的FILE类型包含的内容不完全相同,但是大同小异。 每当打开⼀个文件的时候,系统会根据文件的情况自动创建⼀个FILE结构的变量,并填充其中的信息。

⼀般都是通过⼀个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便。

img

9.指针数组(是数组而非指针)

对于指针数组的理解可以参考整型数组和字符型数组

如下图

b3aa411561354eae95dd6e662165db8f.png a4d99ce34dd548b7af5f0977e0ad6784.png

*在这里有必要将指针数组与数组指针对比一下*

261395204986435db4afe421eb53689c.png

分析:p1优先与[10]结合,p1是数组名,即1式是指针数组。

p2优先与*结合,表明p2是指针变量,即2式是数组指针。

标签:总结,文件,FILE,int,C语言,地址,数组,指针
From: https://www.cnblogs.com/bz-crab/p/18501539

相关文章

  • 零基础C语言入门第四课——分支(上)
    文章目录开篇一、if语句1.1if1.2else1.3分支中包含多条语句1.4嵌套if开篇本篇文章还没写完,后面会继续修改编辑,把分支的笔记整合到一起,大家可以先收藏,后面就可以看到完整版的笔记了前面我们说过,C语言是结构化的程序设计语言,这里的结构指的是顺序结构、选择结构、......
  • [项目][boost搜索引擎#4] cpp-httplib使用 | log.hpp | 前端 | 测试及总结
    目录编写http_server模块1.引入cpp-httplib到项目中2.cpp-httplib的使用介绍3.正式编写http_server九、添加日志到项目中十、编写前端模块十一.详解传gitee十二、项目总结项目的扩展写在前面项目gitee已经上传啦(还是决定将学校和个人的gitee区分开来,所以......
  • 10.11日总结
    上午练习了排球,下午上了马原课晚上学习了javaJava收获一.新项目的名字新项目的名字规范命名取为该项目英文名称的首字母。如学生信息管理系统,英文名为Studentsselectcoursesystem,即取名为sscs。二.构建项目框架(设计数据库)如学生选课管理系统,在做系统前需要进行初步设计,有......
  • 10.24每日总结:程序员修炼之道读后感1
    首次读《程序员修炼之道:从小工到专家》,我深受启发。这本书犹如一盏明灯,为程序员的成长之路指明了方向。在书中,作者强调了许多重要的理念和实践方法。其中,对我触动最深的是关于代码质量的重视。优秀的程序员不仅要追求代码的功能性,更要注重代码的可读性、可维护性和可扩展性。正如......
  • [初识C语言]初识十进制、八进制以及十六进制之间的转换
     序言:本文面对的对象是C语言的初学者,我将会以最简单的方式来让大家快速了解十进制、八进制以及十六进制之间的转换。十进制的转换:十进制转换为八进制:首先我们学习:%o是printf函数中用于输出一个整数的八进制表示的格式说明符下面以十进制的整数10转换为八进制的整......
  • 考试总结 2024Oct-Nov
    考试总结2024Oct-Nov前言:太懒了,不想每次都单独写。\(\def\EZ{\textcolor{#51af44}{\text{EZ}}}\EZ\)表示简单,10分钟内就能想到。\(\def\HD{\textcolor{#3173b3}{\text{HD}}}\HD\)表示中等,能独立想出\(\def\IN{\textcolor{#be2d23}{\text{IN}}}\IN\)表示困难,独立思考能想......
  • (自用)C语言字符串初始化““和\0的问题
    chars[10]="";正常。应该是全部初始化为\0了?printf会输出空白 chars[10]='';报错。【带引号的字符串应至少包含一个字符】【空字符常量】【“初始化”:无法从“char”转换为“char[10]”】 chars[10]='0';报错。【应使用“{…}”初始化聚合对象】【“初始化”......
  • openfeign使用中不能加@RequestMapping和@Async失效的情况总结
    1.openfeign使用中不能加@RequestMapping当在openfeign实现远程调用的时候,添加上了@RequestMapping注解,导致服务无法启动。控制台报错消息如下主要会产生三种问题:·与消费方服务原有接口产生冲突·多个协议包中的RPC接口冲突·使网关路由失效如图:原因:扫描到的FeignCli......
  • 实验3 C语言函数应用编程
    实验一#include<stdio.h>charscore_to_grade(intscore);intmain(){intscore;chargrade;while(scanf("%d",&score)!=EOF){grade=score_to_grade(score);printf("分数:%d,等级:%c\n\n",score,grade);......
  • 20241024比赛总结
    T1数位设\(dp_{i,0/1}\)表示前i位,最后一段是/不是d倍数的方案数令\(d=2^x5^ym\)可以将模d同余转化为模\(2^x\),\(5^y\),\(m\)分别同余因为\(2^{20}=1048576>10^6\)所以,当\(j<=i-20\)时,前两项的结果均为0所以首先可以开两个前缀和,求sum[i-1]*10+s[i]-'0'对前两项的取模结果......