
并不是说是一个地址常量就没有地址(也就是存储常量的存储单元)
当程序没有被调入内存时候,是由三部分代码组成的,依次是二进制代码区(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语言中怎么输出数组的首地址等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)