1. 程式人生 > >const指標、陣列指標、指標陣列理解

const指標、陣列指標、指標陣列理解

 指標中,關鍵字const放在不同的位置表示的意義:

1、const int *p;

    這種情況下,表示的是一個指向常量的指標,程式中不能通過指標來改變它所指向的值,但是指標本身的值可以改變,即指標可以指向其他的資料。就好像她,她就像冷血動物,她是那麼的無情,不論我是多麼的愛她,為她做多少的改變,又或者其他人對她的關心,她都沒有感覺,她只顧她自己,或許我是該去尋找生命中的另外一個,結束這無盡的痛苦。

2、int * const p;

    這種情況下,宣告一個指標常量(也稱常指標)。指標本身的值不可變,即它不能再指向其他資料,但它所指向的資料的值可以改變。就好像我,我的心裡只有她,一直都不會改變,你只要問我最愛的人是誰,一定是她。可是她的心我不懂,我不明白她的心裡到底有沒有我,還是到底她的心在想些什麼,就算有一天,她離我而去,她的心裡裝著別人,我還是一樣傻傻的堅持著。

3、const int * const p;

    這種情況宣告一個指向常量的指標常量,指標本身的值不可改變,它所指向的資料的值也不能通過指標改變。就好像我們曾經的誓言,我的心裡只有她,她的心裡只有我,我們不離不棄,相濡以沫,天荒地老,海枯石爛,永不分離。

理解陣列指標

#include<iostream.h>

void main()

{

       int a[3][3]={1,2,3,4,5,6,7,8,9};

       int i=1,j=1;

       int (*p)[3];

       p=a;

       int x = *(p[i]+j);

       int y = *(p+i)[j];

       cout<<x<<" "<<y<<endl;

}

x=5;y=7;

因為p是一個指向包含3個元素的以為陣列的指標,p=p[0]=&a[0]=&{1,4,7}; p[i]=p[1]=&a[1]=&{2,5,7}; p[i]+j=p[1]+1=&5;

p=a[],a[][]=p[];方括號的優先順序大於*號,所以y其實質是a[],而x實質是a[][];y=*(p+i+j)=*(p+2)=7; 

理解指標陣列

#include<iostream.h>

void main()

{

       int a[5]={1,2,3,4,5};

       int (*pa)[5]=&a;

       cout<<"*pa[0]= "<<*pa[0]<<endl;

       cout<<"*(pa[0]+1)= "<<*(pa[0]+1)<<endl;

       cout<<"*(pa[1])= "<<*(pa[1])<<endl;

       char *pb[5]={"abc","def","123","456","789"};

       cout<<"pb[0]= "<<pb[0]<<endl;

       cout<<"pb[1]= "<<pb[1]<<endl;

}

*pa[0]= 1
*(pa[0]+1)= 2
*(pa[1])= 2367460
pb[0]= abc
pb[1]= def

這裡因為int (*pa)[5] : pa是一個指向 int[5]的一個數組指標

*(pa[1])=*(*(pa+1));相當於把這個指標指的位置移動了一格。

pa指向的是一個數組,把陣列整體當做一個元素來看,當指標的值改變的時候,那麼所指向的值也肯定不是原來的這個陣列了

int (*pa)[5]=&a;

如果是普通的指標,則初始化賦值的時候是賦值的這個陣列中的第一個元素,

a是代表這個陣列的起始位置的地址,比如a[0]

而陣列指標初始化賦值需要賦的是整個陣列在記憶體中的位置,&a是代表整個陣列在記憶體中的位置,就把整個陣列當做一個整體來看