c指標型別的作用

小石王發表於2018-06-10

指標型別的作用

  • 任何型別的指標佔用的空間大小都是相同的(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
", *c);//列印出21,因為是char型別的指標,所以去1個位元組,也就是去的是16進位制的15,十進位制就是21.
  short *s = (short*)&i;
  printf("short:%d
", *s);//列印出-13035,因為是char型別的指標,所以去2個位元組也就是去的是16進位制的cd15,十進位制就是-13035
  int *pi = &i;
  printf("int:%d
", *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
", p,p+1);//int p=0x7fffffffe1e4, p+1=0x7fffffffe1e8
  char *c = (char*)p;
  printf("char p=%p, p+1=%p
", c,c+1);//char p=0x7fffffffe1e4, p+1=0x7fffffffe1e5  
  short *s = (short*)p;
  printf("short p=%p, p+1=%p
", s,s+1);//short p=0x7fffffffe1e4, p+1=0x7fffffffe1e6
  double *d = (double*)p;
  printf("double p=%p, p+1=%p
", 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
", pa,pa+1);//ar[10] p=0x7fffffffe1b0, p+1=0x7fffffffe1d8  
}

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

相關文章