c和c++基础:02

对上一篇的补充几点:
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值