C语言编程之程序存储模式

C语言永远不会过时

其实学编程关键是学习其思想,如果你精通了一门,再去学其他的时候也很容易上手。C不会过时的,尤其是在unix、linux操作平台上,学好C是必须的。

C跟C++在很多方面也是兼容的,c是c++的基础。

再者c能从很大的程度上帮你了解计算机的发展史,数据结构等方面的知识,很多软件、甚至操作系统中的很大部分是用c来实现的。

还有一些电器芯片的程序,比如电冰箱内制冷系统……可以说用c可以解决一切可能遇到的问题,关键是你要能精通它。

所以放开手脚去大胆的学吧,c永远不会过时

程序存储模式分为大端模式和小端模式。

大端模式:字数据的高字节存放在低地址中,低字节存放在高地址中:

小端模式:字数据的高字节存放在高地址中,低字节存放在低地址中:

一个测试是大端模式还是小端模式的方法:

#include

#include

int CheckSystem()

{

int *p=NULL;

union check

{

int i;

char ch;

}c;

c.i=1;

return (c.ch == 1);

}

int main(void)

{

if(CheckSystem())

printf("小端模式");

else

printf("大端模式");

}

输出:

大端模式和小端模式主要在MCU编程是要考虑,在进行MCU编程之前,用上述程序测试一下。

小编推荐一个学C语言/C++的学习裙【 三四一,六三六,七二七】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享

一个奇怪的程序的理解:小端存储

#include

#include

int main(void)

{

int a[5] = ;

int *p1=(int*)(&a+1);

int *p2=(int*)((int)a + 1);

printf("%X %X %X %X ",&a,&a+1,(int)a,(int)a+1);

printf("%X %X ",p1[-1],*p2);

return 0;

}

输出什么?

输出如下:

即:&a == 0x12ff34,(&a+1) == 0x12ff48,((int)a) == 0x12ff34,((int)a +1) == 0x12ff35;

p1指向的是0x12ff48所代表的地址,0x12ff48=0x12ff34+0x14

p2指向的是0x12ff35所代表的地址。

&a即表示a[0]地址,a中各元素地址:

&a[0]==0x12ff34

&a[1]==0x12ff38

&a[2]==0x12ff3c

&a[3]==0x12ff40;

&a[4]==0x12ff44;

内存如下:

可以看出p1指向的实际是a[4]的后面一个内存的地址

而p1[-1]值为5,为a[4],所以p1[-1]等价于p1-1.由于p1指向0x12ff48,所以p1-1指向0x12ff44,也就是a[4]的地址,

所以p1[-1]为5,同理可推断出p1[-2]值为4,p1[-3]值为3,p1[-4]值为2,p1[-5]值为1

再看p2指向的地址为0x12ff35,也就是上图中01后面的那个00所占有的地址,那么*p2指向一个整型值,应该是地址0x12ff35~0x12ff38内的值,为2000000

同理可推断,若int *p2=(int*)((int)a+2);则*p2=20000;若int *p2=(int*)((int)a+3);则*p2=200;若int *p2=(int*)((int)a+4);则*p2=2;

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180618A09ZHD00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券