定義的局部變量在棧區,先定義,后分配(棧:先進后出的數據結構)
可以使用以下程序驗證:
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