欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

c指针类型的作用

程序员文章站 2022-03-23 17:01:14
指针类型的作用 任何类型的指针占用的空间大小都是相同的(32位CPU是4字节;64位CPU是8字节) 既然任何类型的指针占用的空间大小都是相同的,为什么指针还需要类型呢?指针只是指向了一个内存地址,但是当存内存中取值的时候,系统不知道你要从当前指针指向的地址,取几个字节,指定了指针的类型后,系统就知 ......

指针类型的作用

  • 任何类型的指针占用的空间大小都是相同的(32位CPU是4字节;64位CPU是8字节)
  • 既然任何类型的指针占用的空间大小都是相同的,为什么指针还需要类型呢?指针只是指向了一个内存地址,但是当存内存中取值的时候,系统不知道你要从当前指针指向的地址,取几个字节,指定了指针的类型后,系统就知道取几个字节了。char类型取1个字节,short类型取2个字节,int类型去4个字节。
#include <stdio.h>

int main(){
  int i = 123456789;//i的值用16进制表示就是:0x075bcd15
  char *c = (char*)&i;
  printf("char:%d\n", *c);//打印出21,因为是char类型的指针,所以去1个字节,也就是去的是16进制的15,十进制就是21.
  short *s = (short*)&i;
  printf("short:%d\n", *s);//打印出-13035,因为是char类型的指针,所以去2个字节也就是去的是16进制的cd15,十进制就是-13035
  int *pi = &i;
  printf("int:%d\n", *pi);//打印出123456789
}

(gdb) p/a i

$4 = 0x75bcd15

(gdb) p 0x15

$6 = 21

(gdb) p/a -13035

$3 = 0xffffffffffffcd15

  • 指针的加减法运算,也是和指针类型绑定的。对一个没有类型的指针做加1,系统是不知道移动几个字节的,所以必须有类型。int类型的指针值加1后,指针移动4个字节,char类型的指针值加1后,指针移动1个字节,double类型的指针值加1后,指针移动8个字节。下面的例子虽然是同一个地址加1,但是得到的地址完全不同。
#include <stdio.h>

int main(){
  int *p = (int*)0x7fffffffe1e4;
  printf("int p=%p, p+1=%p\n", p,p+1);//int p=0x7fffffffe1e4, p+1=0x7fffffffe1e8
  char *c = (char*)p;
  printf("char p=%p, p+1=%p\n", c,c+1);//char p=0x7fffffffe1e4, p+1=0x7fffffffe1e5  
  short *s = (short*)p;
  printf("short p=%p, p+1=%p\n", s,s+1);//short p=0x7fffffffe1e4, p+1=0x7fffffffe1e6
  double *d = (double*)p;
  printf("double p=%p, p+1=%p\n", d,d+1);//double p=0x7fffffffe1e4, p+1=0x7fffffffe1ec

  int ar[10] = {0};
  int (*pa)[10] = &ar;
  //pa是10个元素的int数组的指针,所以pa+1后,就移动了40(4*10)个字节
  printf("ar[10] p=%p, p+1=%p\n", pa,pa+1);//ar[10] p=0x7fffffffe1b0, p+1=0x7fffffffe1d8  
}

(gdb) p 0xd8-0xb0
$3 = 40