六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 40|回复: 0

指针和数组

[复制链接]

升级  0.65%

321

主题

321

主题

321

主题

探花

Rank: 6Rank: 6

积分
1013
 楼主| 发表于 2013-1-26 12:26:40 | 显示全部楼层 |阅读模式
转载http://kan.weibo.com/con/3512394345711963

C程序:考考你(04)一、取材于某著名公司的软件人员面试题,请问下面程序的输出结果是什么:#include <stdio.h>  int main(void)  {   int a[5] = {1,2,3,4,5};   int *ptr = (int *)(&a+1);   printf("%d, %d", *(a+1), *(ptr-1));   return 0;}答案:2, 5二、理由解释:(1) a是数组首地址,也就是a[0]的地址,(a+1)是数组下一元素的地址,即a[1]的地址,因此*(a+1)就是a[1]的值。(2) &a是对象首地址,该对象是5个int长度的类型,(&a+1)是对象地址加一,即对象首地址加了5个int的长度,因此(&a+1)是a[5]的地址。注:换个写法是否能有助理解。#include <stdio.h>  int main(void)  {   int a[5] = {1,2,3,4,5};   int (*ptr)[5] = &a;   ptr++;   printf("%d, %d", *(a+1), *((int *)ptr-1));   return 0;}三、我的提示:   不同类型的指针加一之后其地址增加的值是不同的,char型指针加一地址增加1,int型指针加一地址增加4,int (*)[5]型指针加一地址增加5个int长度,即20。由此可知对指针进行代数运算是有风险的,因此即将颁布的国军标《军用软件C/C++语言安全子集》中有建议准则“5.3.2.3 谨慎对指针进行代数运算”。
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表