有一整数数组:
- int arr[] = {6,7,8,9,10};
- int *ptr = arr;
- (*ptr++) = (*ptr++)+123;
- printf("*ptr:%d *ptr++:%d\n",*ptr,*ptr++);
程序的输出 ?
自己想一下看看心里想的输出结果,和答案是否一致。
答案是:*ptr:9 *ptr++:8
如果上述蓝色字体的语句换成
(*ptr++) += 123;
printf("*ptr:%d *ptr++:%d\n",*ptr,*ptr++);
程序的输出?
答案是:*ptr:8 *ptr++:7
- (*ptr++) = (*ptr++)+123;====>*ptr = *ptr + 123;
- ptr++;
- ptr++;
这条语句执行完之后arr[]={129,7,8,9,10} ptr指向整数8;;;;;;
- (*ptr++) += 123; ====>*ptr += 123;
- ptr++;
这条语句执行完之后arr[]={129,7,8,9,10} ptr指向 整数7;;;;;;
然后printf函数还有一点小玄机。对于call convention(调用惯例)为stdcall而言,函数的压栈顺序为从右到左一次压栈,然而由call指令再将返回地址压入栈中。
因此在这里将*ptr++压入栈的同时,将指向ptr向前移动了一个位置,指向了下一个整数。
阅读(2605) | 评论(0) | 转发(0) |