数组为什么下标的第一个是从0开始?
因为算数组地址要从1开始的话就得多算一步,从0开始,效率就会高些
#include <stdio.h>
#include <math.h>
void foo(int ary[])
{
ary++;
}
int main(int argc,char* argv[])
{
//一致性和连续性
//数组名ary是第0个元素的地址常量
int ary[5] = {1,2,3,4,5};
foo(ary); //foo(0x18ff34)
printf("%08x\r\n",ary);//ary属于常量,所以不能ary++
/*
数组属于随机访问的数据结构
type ary[N] = ...;
int n = ...;
ary[n] address is:
(int)ary + sizeof(type)*n
*/
/*
printf("%d\r\n",&ary[2]);//下标访问运算符
printf("%d\r\n",(int)ary + sizeof(int)*2);
printf("%d\r\n",&ary[argc]);
printf("%d\r\n",(int)ary + sizeof(int)*argc);
printf("%d\r\n",&ary[argc + 2]);
printf("%d\r\n",(int)ary + sizeof(int)*( argc + 2));
*/
printf("%08x\r\n",&ary[0]);//0x0018ff34
printf("%08x\r\n",&ary[8]);//0x0018ff54
printf("%08x\r\n",&3[ary]);//0x0018ff40
//0x00400000 -> 0x00905a4d ary[(0x00400000-(int)ary)/sizeof(int)] 0x00905a4d
// (00400000 - 0x0018ff3c )/4 + 2 = 9C033
printf("%08x\r\n",ary[(0x00400000-(int)ary)/sizeof(int)]);//0x00400000
system("pause");
return 0;
}
函数交换数值代码
#include <stdio.h>
#include <math.h>
//函数内发生间接访问会影响实际参数
// * [] -> 这三个运算符会产生间接访问
void foo(int x,int y)
{
int nTmp = x;
x = y;
y = nTmp;
}
int main(int argc,char* argv[])
{
int x = 8;
int y = 9;
foo(x,y); //foo(0x18ff34)
printf("%d\t%d\r\n",x,y);
system("pause");
return 0;
}
数组交换数值代码:
#include <stdio.h>
#include <math.h>
//函数内发生间接访问会影响实际参数
// * [] -> 这三个运算符会产生间接访问
void foo(int ary[])
{
int nTmp = ary[0];
ary[0] = ary[1];
aty[1] = nTmp;
}
int main(int argc,char* argv[])
{
//一致性和连续性
//数组名ary是第0个元素的地址常量
int ary[5] = {1,2,3,4,5};
foo(ary); //foo(0x18ff34)
printf("%d\t%d\r\n",ary[0],ary[1]);
system("pause");
return 0;
}
main的栈结构:
使用查看argc的值,可推出调用方栈底
调用方栈底上方会被初始化为局部变量0xcccccccc
接着会初始化数组为1,2,3,4,5
按F11步入调试
callee的栈结构:
猜想
继续按F11
最终实现值转换
结论:
函数内发生间接访问会影响实际参数
- [] -> 这三个运算符会产生间接访问