定义的局部变量在栈区,先定义,后分配(栈:先进后出的数据结构)
可以使用以下程序验证:
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