文章出處

文章列表
最近看了些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編譯如下:

文章列表
全站熱搜