C語言中的指標加減偏移量

qkk123456789發表於2012-07-20

原文地址:http://blog.csdn.net/dobest9014/article/details/5369728

首先看一段程式:

[cpp:nogutter] view plaincopy
  1. #include <stdio.h>  
  2.   
  3. int main()  
  4. {  
  5.     int a[5] = {1, 2, 3, 4, 5};  
  6.     int* p = (int*)(&a + 1);  
  7.   
  8.     printf("%d, %d /n", *(a + 1), *(p - 1));  
  9.   
  10.     return 0;  
  11. }  

 

輸出結果為:

2, 5

 

#include <stdio.h>

int main()
{
	int a[5] = {1, 2, 3, 4, 5};
	int* p = (int*)(a + 1);
	
	printf("%d, %d /n", *(a + 1), *(p - 1));
	
	return 0;
}

第一個結果好說,a+1後指標指向了陣列中的‘2’。 而第二個為什麼輸出‘5’呢。 原理是c語言中的指標加減後,會根據指標的型別採用不同的偏移量。

 

比如, int* a;     int* b = a+1;  則 b - a = sizeof(int)

 

char* a; char* b = a+1; 則b - a = sizeof (char)  

 

 

將上述程式改寫如下,更容易認識其本質

 

[cpp:nogutter] view plaincopy
  1. int main()  
  2. {  
  3.     int a[5] = {1, 2, 3, 4, 5};  
  4.     int (*ptr)[5] = &a + 1;  
  5.   
  6.     //int* p = (int*)(&a + 1);  
  7.   
  8.     int* p = (int*)ptr;  
  9.   
  10.     printf("%d, %d /n", *(a + 1), *(p - 1));  
  11.   
  12.     return 0;  
  13. }  

 

其中只是引入了一箇中間變數 ptr指標, ptr指標的型別是 指向陣列長度為5的指標, 所以 ptr + 1  其實是加了sizeof(a)的位元組量,

ptr+1後指向了從a後面,即a開始數第6個位元組。

 

注意指向陣列指標的寫法。括號不能丟。

 

 

 

int a[n], 則a是一個陣列型別,而不是int型了,要注意正確對待。

 

 

a與&a的值一樣,但意義不一樣, a+1的偏移量為一個int,相當於&a[0], &a+1的偏移量為真個陣列。是陣列型別的指標。

相關文章