【C语言】指针类型的总结

目录

1.普通指针

2.野指针

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

4.二级指针

5.文件指针

6.函数指针

7.结构体指针

8.数组指针

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


我个人将目前在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;
 }

a0a07e08eb3844a0b3a6ecaf472c8ee1.png

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


4.二级指针

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

5bae1b6ecbe148a592835f38e1c12ab2.png

bd855b8482154f0fafef103c3fecd5c6.png

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


5.文件指针

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

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

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

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

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

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

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


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.数组指针

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

f65e6775e98d4d648dda6e85708869c5.png

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

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


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

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

如下图

b3aa411561354eae95dd6e662165db8f.png

a4d99ce34dd548b7af5f0977e0ad6784.png


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

261395204986435db4afe421eb53689c.png

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值