zoukankan      html  css  js  c++  java
  • 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




  • 相关阅读:
    排序算法-Java实现
    Linux-文件内容的查阅
    Linux-文件权限概念
    Linux-awk和sort处理字符串
    面试题-总结(二)
    面试题-总结(一)
    程序员的其他技能:股票-ROE解释
    程序员的其他技能:基金初识-基金名称的秘密
    tp框架表单验证 及ajax
    tp框架做留言板
  • 原文地址:https://www.cnblogs.com/bingdaocaihong/p/6949891.html
Copyright © 2011-2022 走看看