指針的操做:ios
容許:1)同類型指針的賦值數組
2)與整形的加減運算函數
3)指向同一數組內指針的減運算和比較spa
4)賦 ‘0’ 或與 ‘0’ 比較指針
不容許:1)兩指針的相加,相乘除,位移或maskcode
2)與float,double類型相加blog
3)不經過類型轉換,直接賦予除void*以外的其它類型指針內存
指針與數組的相同點:string
1,a[i]能夠用*(a+i)表示io
2, 當傳遞給函數做爲實參時,則都是一個地址
指針和數組的區別:
1,數組是一塊連續區域,要麼是在靜態存儲區被建立(如全局數組),要麼是在棧上被建立,能夠更改指向。數組名對應着(而不是指向)一塊內存,其地址與容量在生命期內保持不變,不能更改指向。指針是一個變量,能夠++;數組不是一個變量,不能夠++
2,sizeof指針表示指針大小,通常爲4byte;sizeof數組表示數組佔內存大小。
3,數組不能夠直接賦值與比較,若是是字符數組要用strcpy和stycmp。指針能夠直接賦值,可是賦過去的是地址。比較通常也不比較地址,通常比較內容。
1 #include <iostream> 2 #include <string.h> 3 using namespace std; 4 5 int main() 6 { 7 //difference 1: 指向是否能夠更改 8 //數組內容可變,可是不能夠++ 9 char d1a[] = "hello"; 10 d1a[2] = 'L'; 11 //d1a++; 12 cout << d1a << endl; 13 //指針指向內容可變,也能夠++ 14 char* d1p = "world"; 15 //d1p[2] = 'R'; 16 cout << " " << d1p << endl; 17 //output the address of point to char 18 cout << "the address of d1p is: " 19 << static_cast<void*>(d1p) << endl; 20 d1p++; 21 cout << "after ++, the address of d1p is: " 22 << static_cast<void*>(d1p) << endl; 23 24 //difference 2: copy and compare 25 //ARRAY, 不能使用賦值或者比較 26 char a[] = "hello"; 27 char b[10]; 28 strcpy(b, a); //can't use b = a; 29 //POINTER, valid 30 char* pa = "world"; 31 char* pb; 32 pb = pa; 33 34 //difference 3: sizeof 35 cout << "the size of a is: " << sizeof(a) << endl; 36 cout << "the size of b is: " << sizeof(pa) << endl; 37 38 }
輸出:
$ ./a.exe heLlo world the address of d1p is: 0x445006 after ++, the address of d1p is: 0x445007 the size of a is: 6 the size of b is: 4