C语言中数组与指针的深层问题,有何高见?
- 内容介绍
- 文章标签
- 相关推荐
本文共计823个文字,预计阅读时间需要4分钟。
最近笔试遇到了这道题,谁都不好意思说自己C/C++有多精通。工作一久,很多老毛病也容易犯了,所以说,理论确实是挺重要的。下面这道题,说实物还是基础更重要。
最近笔试就遇到下面这道题,谁都不敢说自己的C/C++能有多精通,当然,工作一久,很多老毛病也就容易犯了,所以说,理论是真的很重要的,下面这道题,说实话还是挺基础的,虽然当时笔试被我给猜对了,但还是要深究一下具体的转换细节。
如题:
#include <stdio.h> int main(void) { char *str[] = {"ab","cd","ef","gh","ij","kl"}; char *t ; t = (str+4)[-1]; printf("%s\n",t); return 0 ; }
请问以上程序输出结果?程序正确运行结果如下:
我当时一看,数组下标还有负值?这是怎么一回事?我们把上面这个程序变一下,就很清晰了,如下:
#include <stdio.h> int main(void) { char *str[] = {"ab","cd","ef","gh","ij","kl"}; char *t ; // t = (str+4)[-1]; // printf("%s\n",t); t = (str+4)[0] ; printf("t:%s\n",t); return 0 ; }
这个程序毫无疑问,答案就是ij。
看上面这幅图即可得到结果,其实就是这么一个转换关系:
实际上编译系统将数组元素的形式a[i]转换成*(a+i),然后才进行运算。
本文共计823个文字,预计阅读时间需要4分钟。
最近笔试遇到了这道题,谁都不好意思说自己C/C++有多精通。工作一久,很多老毛病也容易犯了,所以说,理论确实是挺重要的。下面这道题,说实物还是基础更重要。
最近笔试就遇到下面这道题,谁都不敢说自己的C/C++能有多精通,当然,工作一久,很多老毛病也就容易犯了,所以说,理论是真的很重要的,下面这道题,说实话还是挺基础的,虽然当时笔试被我给猜对了,但还是要深究一下具体的转换细节。
如题:
#include <stdio.h> int main(void) { char *str[] = {"ab","cd","ef","gh","ij","kl"}; char *t ; t = (str+4)[-1]; printf("%s\n",t); return 0 ; }
请问以上程序输出结果?程序正确运行结果如下:
我当时一看,数组下标还有负值?这是怎么一回事?我们把上面这个程序变一下,就很清晰了,如下:
#include <stdio.h> int main(void) { char *str[] = {"ab","cd","ef","gh","ij","kl"}; char *t ; // t = (str+4)[-1]; // printf("%s\n",t); t = (str+4)[0] ; printf("t:%s\n",t); return 0 ; }
这个程序毫无疑问,答案就是ij。
看上面这幅图即可得到结果,其实就是这么一个转换关系:
实际上编译系统将数组元素的形式a[i]转换成*(a+i),然后才进行运算。

