对上一篇的补充几点:
1.指针常量只能在定义的时候初始化;
2.常量地址只能赋值给常量指针;
3.const int * const p为指向常量的指针常量,第一个const修饰指针指向的内容。
指针数组和数组指针
1.指针数组:int *p[5] (存放指针的数组)
[]的优先级比 * 的优先级高,p先与[]结合成为数组,再与int *结合成为int *类型的数组。
2.数组指针:int (*p)[5] (指向数组的指针)
int a[5] = {1,2,3,4,5};
p = &a; (指针p指向数组a)
3.数组指针与二维数组:
假设数组a的地址为0x0012320;
- int a[2][5] = {{1,2,3,4,5},{6,7,8,9,10}};
- int (*p)[5]= a;
- cout << p << endl;
- cout << p+1 << endl;
- cout << *p << endl;
- cout << *p+1 << endl;
- cout << *(p+1) << endl;
- cout << **p << endl;
- cout << **(p+1) << endl;
- cout << *(*p+1) << endl;
分析:
①二维数组有两个元素,每个元素都是有五个元素的一维数组,p是指向有五个元素的一维数组的指针,p就是二维数组a的首元素的地址,即为:p = &a[0],则输出为0x12320;
②p+1为二维数组的第二个元素的地址,即p+1 = &a[1],偏移的地址为第一个元素所占的空间,即:sizeof(int)5 = 20;
所以p+1 = 0x12334;
③p为二维数组的首元素a[0]的地址,而首元素a[0]为一个有五个元素的一维数组,所以p指向a[0]数组的首元素,即p为a[0]数组的首元素的地址,即为a的地址0x12320;
④p+1则为a[0]数组中第二个元素的地址,即为0x12320+sizeof(int) = 0x12324;
⑤p+1为a的第二个元素,(p+1)则为第二个元素a[1]数组的首元素的地址,即为0x12334
⑥p为a[0]数组中的首元素1
⑦(p+1)为a[1]数组中的首元素6
⑧(*p+1) a[0]数组中的第二个元素2
4.指针数组和指向指针的指针
- char *str[4] = {“welcome” , “to” , “new” , “beijing”};
- char **p = str + 1;
- str[0] = (*p++) + 1;
- str[1] = *(p + 1);
- str[2] = p[1] + 3;
- str[3] = p[0] + (str[2] - str[1]);
- 写出指针数组str中四个指针元素的值;
分析:
str是一个有四个元素的指针数组,每个元素为指向char型的指针,初始化后每个指针指向字符串的首字母。
str为数组名相当于首元素的地址,str+1则为第一个元素的地址,所以p指向数组的第二个元素str[1]。
①p指向数组的第二个元素,p为str[1],因为++为后置所以先不管,则p+1为从字符串的第二个字母开始,所以p+1=o
②上一个p++为数组的第三个元素,再进行(p+1),先p+1为数组的第四个元素,取值为beijing。
③p[1]等价于*(p+1) ,所以p[1] = beijing,再+3为指向字符串beijing第四个字符,即为jing。
④p[0] = jing,str[2]-str[1]为元素个数的差为3,所以为p[0]+3,即为g。
最后:
str[0] 为 o ; str[1] 为 beijing ; str[2] 为 jing ; str[3] 为 g