文章出處

最近看了些C面試題順便復習一下C語言,現貼一些出來和大家分享。

1 #include <stdio.h>
2  void main ()
3   {
4     int arr[]={6,7,8,9,10};---------1
5     int *ptr=arr;             ---------2
6     *(ptr++)+=123;        ----------3
7     printf("%d,%d\n",*ptr,*(++ptr)); ---------4
8   }

【解析】:這段代碼應該是比較簡單的一個面試題,首先在主函數里,定義了一個一維數組,接著ptr被初始化為數組arr首地址,也就是一二兩句一般都沒啥問題,但是第三句有可能就會產生分歧了,有人可能認為,根據書中的表達,括號的優先級應該是大于指針大于++大于+=,所以應該是先執行ptr++然后事實并非如此,此處是需要先賦值,再自加的,也就是第三句代碼是被兩句代碼合二為一了,可分解如下:*ptr=*ptr+123; ptr++;由數組名是數組首元素的地址可知,首元素為6+123=129,而ptr自加一,指向了7所在的地址第四句代碼為printf輸出,printf輸出是從右向左壓棧(有興趣的朋友可以測試下printf為什么是從右向左壓棧輸出的:))所以輸出時先執行*(++ptr),也就是指針再加,指向元素8所在的地址,*(++ptr)為取出元素8,此時ptr已經為指向8所在的地址,故*ptr同樣為8.

使用VS2012編譯如下:


 

文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()