1. 程式人生 > >c指針類型的作用

c指針類型的作用

系統 既然 spa 得到 double類型 tdi 完全 bcd pan

指針類型的作用

  • 任何類型的指針占用的空間大小都是相同的(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 }

c指針類型的作用