C语言中定义变量的先后顺序和为变量分配内存的顺序

定义的局部变量在栈区,先定义,后分配(栈:先进后出的数据结构)

可以使用以下程序验证:

 1 #include <stdio.h>
 2 #include<windows.h>
 3 
 4 int main()
 5 {   //定义变量的时候必须是在{开始的位置 ---------栈区变量
 6 
 7     int  a;
 8     int  b;  //a ,b都是局部变量 在栈区
 9 
10 //看到不是变量的时候开始分配空间  
11    printf("%p
",&a);
12    printf("%p
",&b);
13 
14     system("pause");
15     return 0;
16 }

运行的结果是:

                   

结果分析:先定义的先入栈(在栈内不分配空间),因此a在栈底 b在栈顶。

出栈的时候地址先分配给b,后分配给a,因而a的地址比b的大

如下图所示:

     

变量定义的时候必须在大括号 {开始的位置

 1 #include <stdio.h>
 2 #include<windows.h>
 3 
 4 int main()
 5 {
 6     int  a;
 7     int  b;  //a ,b都是局部变量 在栈区
 8    printf("%p
",&a);
 9    printf("%p
",&b);
10    {
11        int c;
12    printf("%p
",&c);
13    }
14   
15     system("pause");
16     return 0;
17 }

输出结果如下: 相差C???

                       

   2、小插入一下printf("a=%#x ",a)这个#什么意思?(关于地址的输出格式)

这里的"a=%#x
"意思是:是一个格式控制符,其中a=是普通字符,%#x是格式说明,
是转义字符;其中的%#表示的输出提示方式,如果是8进制,在前面加0,如果是十进制,不加任何字符,如果是十六进制,会加上0x
举例说明:
当a='x41'; //这里应该是单引号
当执行:
printf("a=%#o ",c); //输出的是:0101(把16进制41转化为8进制)
printf("a=%#d ",c); //输出的是:65(把16进制41转化为10进制)
printf("a=%#x ",c); // 输出的是:0x41

3、printf中%p的输出应用
%p表示输出以内存中实际存储一个变量格式(十六进制、32位(视机器的位数而定))的值,通常也就是地址的值,但也不一定,要看具体输出的是什么。
 1 #include <stdio.h>
 2 #include<windows.h>
 3 
 4 
 5   int main()  
 6  {  
 7       int  a=20;  
 8       int *p=&a;  
 9       printf("%d
",a);  
10       printf("%p
",a); //用不同的输出格式输出a的值
11      
12       printf("%d
",p);
13       printf("%d
",&a);
14       printf("%p
",p);  //不同的格式输出a的地址
15 
16       system("pause");
17       return 0;  
18  }  

运行结果如下:

             

输出P是8位16进制的数据-------这个是因为这个程序是在32位机器上运行的,且16进制的一位是用4位二进制表示   0x00000000~0xFFFFFFFF

0000  0001  0010  0011  0100  0101

0110  0111  1000  1001  1010  1011

1100  1101  1110  1111




原文地址:https://www.cnblogs.com/bingdaocaihong/p/6949891.html