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\n",&a);
12    printf("%p\n",&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\n",&a);
 9    printf("%p\n",&b);
10    {
11        int c;
12    printf("%p\n",&c);
13    }
14   
15     system("pause");
16     return 0;
17 }

輸出結果如下: 相差C???

                       

   2、小插入一下printf("a=%#x\n",a)這個#什么意思?(關於地址的輸出格式)

這里的"a=%#x\n"意思是:是一個格式控制符,其中a=是普通字符,%#x是格式說明,\n是轉義字符;其中的%#表示的輸出提示方式,如果是8進制,在前面加0,如果是十進制,不加任何字符,如果是十六進制,會加上0x
舉例說明:
當a='\x41'; //這里應該是單引號
當執行:
printf("a=%#o\n",c); //輸出的是:0101(把16進制41轉化為8進制)
printf("a=%#d\n",c); //輸出的是:65(把16進制41轉化為10進制)
printf("a=%#x\n",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\n",a);  
10       printf("%p\n",a); //用不同的輸出格式輸出a的值
11      
12       printf("%d\n",p);
13       printf("%d\n",&a);
14       printf("%p\n",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

 





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM