预测下面程序的输出:
08 | printf ( "arr[0] = %d, arr[1] = %d, *p = %d" , arr[0], arr[1], *p); |
18 | printf ( "arr[0] = %d, arr[1] = %d, *p = %d" , arr[0], arr[1], *p); |
28 | printf ( "arr[0] = %d, arr[1] = %d, *p = %d" , arr[0], arr[1], *p); |
只要记住下面的运算规则就不难预测程序的输出:
1) 前置 ++ 和 * 的优先级是相同,都是从右向左结合
2) 后置++的优先级高于 *和前置++, 后置++从左向右结合
参考:C语言中运算符的优先级
程序1: ++*p 优先级相同且都从右向左结合,可以看做是 ++(*p) ,因此p所指向的那个数改变了。arr[0] = 11, arr[1] = 20, *p = 11
程序2: *p++ 可以看做是 *(p++), 指针的地址是变了,内容没变。arr[0] = 10, arr[1] = 20, *p = 20
程序3:*++p 优先级相同且都从右向左结合,可以看做是 *(++p). arr[0] = 10, arr[1] = 20, *p = 20
原文:http://www.acmerblog.com/interview-pointer-p-5539.html