1. 程式人生 > >指標的加減操作和比較

指標的加減操作和比較

指標加減的例題程式碼:

#include<stdio.h>

int main(void)
{
	 int a[5] = {1,2,3,4,5} ;
	 int *ptr = (int *)(&a+1) ;
	 
	 printf("%d\n",*(a+1)) ;
	 printf("%d\n",*(ptr-1)) ;
	 
	 return 0 ;
	 
}
解析:       這裡主要是關於指標加減操作的理解。對指標進行加1操作,得到的是下一個元素的地址,而不是原有地址值直接加1,所以,一個型別為t的指標的移動,以sizeof(t)為移動單位。 (1)程式碼第5行,宣告一個一維陣列,並且a有5個元素。
(2)程式碼第6行,ptr是一個int型指標&a+1,即取a的地址,該地址的值加sizeof(a)的值,即&a+5*sizeof(int),也就是       a[5]的地址,顯然當前指標已經超越了陣列的界限。(int*)(&a+1)則是把上一步計算出來的地址,強制轉換為int*           型別,賦值給ptr。 (3)程式碼第8行,a與&a的地址是一樣的,但意思不一樣,a是陣列首地址,也就是a[0]的地址;&a是物件(陣列)首       地址,a+1是陣列下一元素的地址,即a[1];而&a+1是下一個物件的地址,即a[5]。因此這裡輸出為2.
(4)程式碼第9行,因為ptr指向a[5],並且ptr是int*型別,所以*(ptr-1)指向a[4],輸出5。 指標的比較程式碼:
#include<iostream>
using namespace std ;

int main(void)
{
	 char str1[] = "abc" ;
	 char str2[] = "abc" ;
	 const char str3[] = "abc" ;
	 const char str4[] = "abc" ;
	 const char* str5 = "abc" ;
	 const char* str6 = "abc" ;
	 char * str7 = "abc" ;
	 char * str8 = "abc" ;
	
	 cout<<(str1 == str2)<<endl ;
	 cout<<(str3 == str4)<<endl ;
	 cout<<(str5 == str6)<<endl ;
	 cout<<(str6 == str7)<<endl ;
	 cout<<(str7 == str8)<<endl ;
	 
	 return 0 ;
	 
}

      陣列str1,str2,str3和str4都是在棧中分配的,記憶體中的內容都為“abc”加一個“\0”,但是它們的位置是不同的。因此程式碼第15行和第16行的輸出都是0 ;      指標str5,str6,str7和str8也是在棧中分配,它們都指向“abc”字串,注意“abc”存放在資料區,所以str5,str6,str7和str8其實指向同一塊資料區的記憶體。因此第17,18和19行的輸出是1。