指针数组和数组指针的使用

问题
程序找错or程序结果

#include <stdio.h>
int main()
{
    char *str[] ={"welcome","to","liaoning","shenyang"};
    char **p = str+1;
    str[0] = (*p++)+2;
    str[1] = *(p+1);
    str[2] =p[1]+3;
    str[3] =p[0] +(str[2]-str[1]);
    printf("%s\n",str[0]);   //(空)
    printf("%s\n",str[1]);  //shenyang
    printf("%s\n",str[2]);  //nyang
    printf("%s\n",str[3]);  //ng
    return 0;
}

分析:
第 1个字符串的首地址的存放地址标记为A,其内容为“welcome”;
第 2个字符串的首地址的存放地址标记为B,其内容为“to”;
第 3个字符串的首地址的存放地址标记为C,其内容为“liaoning”;
第 4个字符串的首地址的存放地址标记为D,其内容为“shenyang”;
执行完,**p = str +1后,p指向B.
执行完下一句后,p指向C,而str[0]指向第4个字符串“shenyang”后面的元素,因此其内容为空。
执行完下一句后,p没有移动,str[1]指向p的后一个元素地址,即D;
执行完下一句后,p[1] 指向D,p[1]+3即指向字符串的元素的第4个元素,即‘n’字符的地址;
执行完下一句后,因为str[2]-str[1] 等于3,p[0]即指向‘n’的地址,所以,str[3]指向yang中的‘n’字符的地址;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值