关于C语言中对数组取址的问题,详见补充:

关于C语言中对数组取址的问题,详见补充:,第1张

对于一个数组来说,数组名是一个地址常量

并不是说是一个地址常量就没有地址(也就是存储常量的存储单元)

当程序没有被调入内存时候,是由三部分代码组成的,依次是二进制代码区(text segment),已经被初始化的静态或者全局变量区(data segment),没有被初始化的静态或者全局变量区(bss segment),常量都是存放在data segment区

当程序被调入内存之后,就在三部分的基础上又被分配了堆区和栈区,栈区用来存放临时变量,参数和返回值等临时的变量

就相当于我们定义char a="12345",我们都知道这里的“a”是main()中定义的一个指向字符串“12345”的指针,那么“12345”是存放在哪里的呢,就是存放在data segment区的,而“a”变量本身确实存放在程序调入内存后被自动分配的栈区

强制转换的本质上是不改变存储单元中的01代码组合的,只是告诉编译器这个单元的数据将要被作为什么数据处理,例如一个指针变量占据4字节,一个int变量也是四个字节,我们就可以把int强制转换成指针的,需要的时候再把指针转换成int,输出int型结果时是不发生变化的

在这个题目中,“a”是一个数组名,也就是一个地址常量,这个常量存放在data segment区,“&a”取了“a”的地址,也就是一个指向“a”的指针,所以第三个语句是把指向“a”的指针进行了强制转换,第一个语句直接转换的“a”,第二个语句强制转换指向“a[0]”的指针

void e2prom_reads(1,&ptr,4); //这样调用对吗?

不对 应该是 void e2prom_reads(1,&ptr[0],4);

或者 void e2prom_reads(1,ptr,4);

%p 直接用16进制地址形式输出地址

%d 把地址直接用10进制形式输出

char a[] = "hellow C++";

int b[] = {0x01,0x02,4,0x08,0};

如上数组如下输出都可以:

printf("十进制地址%d 十六进制地址%p", a, a);

printf("十进制地址%d 十六进制地址%p", b, b);

printf("十进制地址%d 十六进制地址%p", &a[0], &a[0]);

printf("十进制地址%d 十六进制地址%p", &b[0], &b[0]);

以上就是关于关于C语言中对数组取址的问题,详见补充:全部的内容,包括:关于C语言中对数组取址的问题,详见补充:、C语言如何知道数组的首地址是多少、C语言中怎么输出数组的首地址等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9814800.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存