数组与指针

来源:互联网 发布:机电专业就业前景 知乎 编辑:程序博客网 时间:2024/06/06 00:20
指针是一直困扰我的问题,下来就今天所学的知识结合做题来记录下自己对指针与数组之间联系的理解,如有错误,请高手指出。下面两道是课堂上老师给出的题目:题目一:
char *c[] = { "ENTER", "NEW", "POINT", "FIRST" }; char **cp[] = { c+3, c+2, c+1, c }; char ***cpp = cp; int main(void){     printf("%s\n", **++cpp);       //1    printf("%s\n", *--*++cpp+3);   //2    printf("%s\n", *cpp[-2]+3);    //3    printf("%s\n", cpp[-1][-1]+1); //4    return 0;}

为了方便,我给主函数下的每条语句给了编号。
先看第1句:三级指针cpp是指向cp这个二级指针数组的首元素的,即指向c+3的地址,cpp自加后指向的是c+2,再对其进行“*”运算则确实指向c+2;二级指针cp又指向一维数组c的首元素,c+2是“POINT”的地址,对其进行解引用后就得到“POINT”,因此第1句输出的结果就是字符串“POINT”。
再看第2句:先要明白程序执行完第1句后cpp指向的是c+2的地址;++cpp后,指针就指向了c+1的地址,“*”后,cpp确实指向了c+1,而c+1指向”NEW”,–之后cpp指向了“ENTER”,再+3后cpp指向的是“ENTER”中的“E”,则第二句输出的字符串应当是“ER”。
下面继续第3句:第2句结束后cpp指向依旧是c+1,*cpp[-2]+3,相当于
((cpp-2))+3, cpp-2后指向c+3的地址,“*”运算后确实指向c+3的首地址, 即“FIRST”的首地址,然后+3则表示cpp相对于首地址的偏移量为3,现在应该指向的是“S”,最后输出的字符串应该是“ST”。
最后,第4句:谨记cpp的指向依旧是c+1的地址,cpp[-1][-1]+1相当于
((cpp-1)-1) + 1,cpp-1变为指向c+2的地址,即“POINT”的地址,再减1,则指向“NEW”的地址,“*”运算后指向“NEW”的首地址,加1则指向了“E”,所以最后输出字符串“EW”。
下面试运行结果:

这里写图片描述

题目二:

int main()  {      char *str[]={"welcome","to","Fortemedia","Nanjing"};      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]);       printf("%s\n",str[2]);     printf("%s\n",str[3]);       return 0;  }

根据题目可以知道p指向的是“to”的首元素地址,str[0]= (*p++)+2,指向了“to”这个字符串的末尾“\0”,所以输出的是\0。
输出了str[0]后p指针就指向了“Fortemedia”的首地址,*(p+1)使得拍指向了“Nanjing”,因此str[1]输出“Nanjing”。
此时char *str[ ]中的前两个元素应分别是 \0和Nanjing, 第三个元素即str[2] = p[1]+3, 即p指向了”jing”中的“j”,最后输出字符串“jing”。
最后的str[3] = p[0] +(str[2] - str[1]); 也就是str[3] = p[0] + 3; 这样指针p就指向了“jing”中的最后一个字母“g”,所以str[3]输出的是“g”。

下面给出运行结果:
这里写图片描述

上面就是我自己对这两道题的理解,自己也正在学习阶段,不知道说清楚没有,如有错误,还请高手指出。

原创粉丝点击