C 之指標,引用與陣列

2022-03-05 02:33:34 字數 2050 閱讀 3869

引用只是物件的另乙個名字,通過在變數名前面新增"&」符號來定義,而指標儲存的是另乙個物件的位址,它們兩都提供了間接訪問所服務變數的途徑。

但是它們的差別還是挺大的:

先從它們的值說起,乙個有效的指標值通常具有三種面孔,一是儲存乙個特定物件的位址,而且一般是用取位址符號「&」把該特定物件的位址拿出來賦

給指標;二是0值,此時表明它不指向任何物件,儘管任乙個int型變數的值可能為0,但是直接把int型變數賦給指標是非法的,不過,如果是在編譯時可以

獲得0值的const變數則指針對它網開一面,也就是說,int s=0;int *p=s 是不行的,但是 const int s=0;int *p=s 或者直接int *p=0 都是可以的;三

是未初始化的指標,此時是無效的,直到它被賦值時才被可以使用。相對於指標,引用則顯得苛刻但是專情,引用一經定義就必須用與該型別同型別的物件

初始化,就連同型別的具體值也不接受,如 int s=1024;int &t=s 是可以,但是int &s=10 或者 直接不初始化 int &s;都是不行的,這是它的苛刻之處。

不過它的專情就在於,當引用初始化後,只要它還存在,它就保持繫結到初始化時指定的物件,不接受繫結到它身上的其他物件。

其次,在賦值行為上也是反映不同:給引用賦值修改的是該引用所關聯的物件的值,而給指標賦值是使指標指向另乙個物件如:

int i=100,t=200;

int *p1=&i,*p2=&t;

p1=p2;//p1所指向的i物件值保持不變,賦值操作改變了p1指標的值,使其指向另外乙個不同的物件

int &r1=i,&r2=t;

r1=r2;//這個操作修改了r1引用的值i物件,而非引用本身,賦值後,這兩個引用還是分別指向原來關聯的物件,此時這兩個物件的值相等。

在與const的結合上,所謂的const引用是指向const物件的引用,因此毫無疑問,如果要賦值給引用的物件本身是const,那麼引用就得是const,即如

下:const int val=100;

const int &val2=val;//注意:如果物件是const,那麼引用就得是const

此時,我們可以讀取但不能修改val2,任何對val2的賦值都是不合法的,我們可以這樣理解,既然已經規定我們不能對val賦值從而修改它的值,那麼修改

它的間接途徑即使用val2引用也得禁止.不過,相對於非const引用,const引用相對放得開,那就是cosnt引用可以初始化為不同型別的物件或者初始化為

右值,即如下可行:

double dval=3.00;

const int &ri=dval;

const int &intval=43;

指向const物件的指標 :const double *pointer;,這裡的pointer是乙個指向double型別的const物件的指標,const限定了pointer指標所指向的物件

的型別,而非pointer指標本身,因此,我們可以給pointer重新賦值,使其指向另外乙個物件,但是我們不能通過pointer修改其所指向的物件。c++強制

要求指向const物件的的指標也必須具有const特性。因此,如下會報錯:

const double p1=2.33;

double *ptr=&p1;

但允許把非const物件的位址賦值給指向const物件的指標,此時,我們同樣不能使用該指標來修改該非const物件,但是我們可以使用其他方法來修改其

使指向物件的值。

const指標:int *const ptr=&intval;指標本身的值不能修改,所以,但是此時指標所指向的物件的值可否被修改,則取決於該物件的型別,如果,此時

的物件剛好也是const,那就物件值也不能被改,此時 const double *const ptr=doubleval 叫做指向const物件的const指標。

好了,接下來,聊聊指標與陣列的關係了!

定義的時候為陣列形參指定的邊界,即

void fun(int ary[12]) 在陣列實參傳入時,跟void fun(int ary)是一樣的

當然,如果希望函式只接受含有特定數量的元素的陣列,那麼,使用引用陣列形參可以做到,即void fun(int (&ary)[12]);

初識C 之指標與引用

1 what a.指標 指標可以看做是乙個特殊的變數,它是用來存放變數的位址值的。b.引用 引用的話,可以看做是給變數起的乙個別名,而不是定義乙個新變數,它與那個變數的本質是相同的,內容與位址都是一樣的。2 distinction a.引用使用時無需解引用 指標需要解引用 b.引用沒有 const,...

C 陣列引用傳遞與指標傳遞

include include include using namespace std class sourcefile explicit sourcefile const char filename data filename const char data int size int main i...

C 指標與引用

include 引用傳遞 int add1 int x,int y 指標傳遞 int add2 int x,int y 值傳遞 int add3 int x,int y void main int a 1 int b a 引用,表示b的引用指向了a 定義引用 開頭 必須賦初值 引用變數不占用記憶體 ...