C语言——深入理解数组

数组为什么下标的第一个是从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
在这里插入图片描述

最终实现值转换
在这里插入图片描述

结论:

函数内发生间接访问会影响实际参数

  • [] -> 这三个运算符会产生间接访问
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑桃鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值