指针中,关键字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是代表整个数组在内存中的位置,就把整个数组当做一个整体来看