指針和數組基本等價的緣由在於指針算術和C++內部處理數組的方式。 ——《C++PrimerPlus》第五版html
在多數狀況下,C++將數組名解釋爲數組中第一個元素的地址。c++
int arr[10] = {1,2,3,4,5}; int *p = arr; cout<<" -------------- 3 種方式獲得數組的地址 ------------------- "<<endl; cout<<"arr -> "<<arr<<endl; cout<<"&arr[0] -> "<<&arr[0]<<endl; cout<<"p -> "<<p<<endl; cout<<" -------------- 4 種方式獲得數組的值 ------------------- "<<endl; cout<<"arr[1] -> "<<arr[1]<<endl; cout<<"*(arr+1) -> "<<*(arr+1)<<endl; cout<<"*(p+1) -> "<<*(p+1)<<endl; cout<<"p[1] -> "<<p[1]<<endl;
總結:數組
arrayname[i] 等價於 *(arrayname+i)
這部分參考微博:http://www.cnblogs.com/Romi/archive/2012/01/10/2317898.htmlspa
指針數組:array of pointers,即用於存儲指針的數組,也就是數組元素都是指針3d
數組指針:a pointer to an array,即指向數組的指針指針
還要注意的是他們用法的區別,下面舉例說明。htm
int* a[4] 指針數組 對象
表示:數組a[4]是指針,指針的類型是int*,指針的指向類型是intblog
元素表示:*a[i] *(a[i])是同樣的,由於[]優先級高於*ci
int (*a)[4] 數組指針
表示:a是指針的類型是int*[4], 指針的指向的類型爲int()[4]
元素表示:(*a)[i]
#include<bits/stdc++.h> using namespace std; int main() { /*** 指針數組 ** <數組 pstr[3],數組的元素是指針> 三省指針:指針的類型是 int * ,指向的類型是int ,數組內每一個指針分別指向 三個字符串的首地址 ***/ char *pstr[3] = { "Socialism", "with", "Chinese" }; cout<<" pstr[0] "<<pstr[0][0]<<endl;; cout<<" pstr[1] "<<pstr[1]<<endl;; cout<<" pstr[2] "<<pstr[2]<<endl;; /*** 數組指針 ** <指針 pstr1> 三省指針:指針的類型是 int (*)[20] ,指向的類型是int()[20] ,指針指向 str1 ***/ char str1[20] = "Characteristics"; char (*pstr1)[20] = &str1; //b=&str1; cout<<" *pstr1 "<<*pstr1<<endl;; }
注意:字符串至關於一個數組常量,內容不可改變,且只能爲右值,若是當作指針,便是常量指針也是指針常量
指針常量:該指針是一個常量,不可改變,指向某一個地址就不能改變,可是0指向的單元是能夠改變的,通常讀作常量指向
常量指針:指針的值不能改變,可是自身是一個變量,讀做指向常量
數組名是數組的首地址
a)含義:
聲明一個數組 : TYPE arrayname[N];
有兩層含義:1.arrayname是一個數組,類型是TYPE[N]
2.array是一個常量指針,指針的類型是TYPE *,指向類型是TYPE,指向的值是數組的第0號元素,注意arrayname和數組第0號元素的地址是不一樣的,arrayname是指針常量,arrayname++是錯誤的。
b)功能
sizeof(arrayname) &arrname | arrayname表明的是數組自己,獲得的是整個數組的大小 此時 &arrname 表示的是 指向是整個數組 |
*arrayname (等同 arrayname[0]) | arrayname表明的是指針,獲得的是數組第0號元素的值 |
arrayname+i | arrayname表明的是指針,獲得的是指針向後偏移i個指向類型的單位的指針 |
補充:sizeof(對象)測出的都是對象自身的類型大小