c语言初学者—指针变量类型的意义和运算

目录

1.指针变量类型的意义

1.1指针的解引用

1.2指针 +  -  整数  

1.3 void 指针 

2. const 修饰指针 

3.指针运算

1.指针变量类型的意义

 指针变量的大小和类型无关,只要是指针变量,在同⼀个平台下,大小都是⼀样的,为什么还要有各种各样的指针类型呢?

1.1指针的解引用

通过调试,对比下面的代码,主要观察内存的变化 

       通过调试,我们可以看到,第一个代码会将 四个字节全部改为 ,第二个代码会将 第一个字节改为 0

 总结:

指针的类型决定了,对指针解引用的时候有多大的权限(⼀次能操作几个字节)。

  1.  char *    的指针解引用就能访问 ⼀个字节
  2.  int *        的指针的解引用能访问 四个字节
  3. float *      的指针的解引用能访问 四个字节
  4.  double * 的指针的解引用能访问 八个字节
  5. float  *     的指针的解引用能访问 二个字节

1.2指针 +  -  整数  

通过下面的代码,调试观察它们的地址变化

       我们可以看出,char * 类型的指针变量 +1 跳过1个字节int * 类型的指针变量 +1 跳过了4个字节。 这就是指针变量的类型差异带来的变化。 

总结:指针的类型决定了指针向前或者向后走一步有多大(距离

1.3 void 指针 

        在指针类型中有⼀种特殊的类型是 void * 类型的,可以理解为无具体类型的指针(或者叫泛型指针),这种类型的指针可以用来接受任意类型地址。但是也有局限性, void * 类型的指针不能直接进行指针的 +  -  整数解引⽤的运算。 

   在代码中,将⼀个 int  类型的变量的地址赋值给⼀个  char *  类型的指针变量。 编译器给出了⼀个警告(如左图),是因为类型不兼容。  而使用  void *  类型就不会有这样的问题。 

使用 void * 类型的指针接收地址并修改 

通过左边的图,我们可以清晰的看到 void * 类型的指针可以接收不同类型地址,但是无法进行修改                 那么 void * 类型的指针有什么用呢?    ⼀般 void *  类型的指针是使用在函数参数的部分,用来接收不同类型数据的地址,这样的设计可以实现泛型编程的效果。

2. const 修饰指针 

总结:

  1. const  如果放在 * 左边,限制的是 * p ,意思是不能通过指针变量 * p 去修改 p 指向的空间的内容, * p  // err     但是p变量不受限制,还是可以修改的,p=&b // ok
  2. const 如果放在 *右边,限制的是 p 变量,意思是 p 变量不能被修改,无法指向其他变量    p = & b // err     但是 指针变量*p不受限制 还是可以修改的,* p // ok
  3. const 如果放在的两边,则都不能修改

3.指针运算 

  1. 指针 + 整数 = 指针   

总结:指针每加一个整数的内存空间就打印下一个整数,以此类推,直到循环结束

  1. p=0x005AF9C0
  2. p+1=0x005AF9C4
  3. p+2=0x005AF9C8
  4. ……

一个整型变量的内存空间等于四个字节,相当于指针与下一个指针的地址空间互相相差四个字节 

  1. 指针 -  指针 = 整数

 总结:

        指针-指针等于整数,用于计算两个指针在内存中的相对位置,并通过类型转换将其表示为整数 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值