练习一
1.下面程序的输出是什么?
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
首先看*(a + 1)
,这个就是a[1],很容易。比较不常见的是(&a + 1)
我们知道a就已经算是一个地址了。这个地址代表的事这个数组的第一个元素的地址。而&a就代表数组的地址。(&a + 1)
相当于偏移了一个数组。然后得到地址给ptr,如下图:
然后*(ptr - 1)
是表示那个指针向前移动了一个整形,然后就指向了5.所以结果就是2,5啦。
2.有下面一段代码:
char szMsisdn[MAX_LEN_MSISDN-1];
szMsisdn[sizeof(szMsidn)]=’\0’;
则对执行以上代码后,会出现什么问题?
解析:答案是选择第二个,数组越界。
首先先复习一下sizeof
运算符,sizeof
返回一个表达式或者一个类型名字所占的字节数。运算符满足右结合率,其所得的值是一个size_t
类型的常量表达式。sizeof
一般有两种使用方式。
sizeof(类型)
sizeof 表达式
a在第二种形式中,sizeof返回的是表达式结果类型的大小。(sizeof并不实际计算其运算对象的值)这里举一