指针:也是变量,存放变量的地址。

指针是变量的一个间接,变量是内存的一个间接。

虚拟内存中地址总线确定了你能访问的内存空间。

32位cpu最大的虚拟内存: 2^32 = 4 GB 所以32位的XP使用8G内存并没有什么用。

指针存放的变量地址是一个十六进制的数据表示的一组数据,而并非实际的内存中的内容。

int *pMyInt;   pmyint 表示存放的地址,是一块内存地址。     int 表示这块地址里面存放的数据类型   *表示指针变量

指针变量= 指针。描述方便。指针变量所存放的地址里面的值,如图

*mypointer = 27; 表示mypointer这个地址里面存放的内容是27。


cp oldname newname path  文件复制。 %s 输出字符串。可以接收__func__的值。


函数调用的时候是进行值传递的。


变量作用域

文件作用域变量也被称为全局变量。

%p 打印变量地址。用&变量名赋值。 pintf(“ %p “,&numdots);

extern int numDots;//声明numDots是一个外部变量,其是一个全局变量,在其他部分声明过了。

文件作用域是在该文件中一个有用的,通过static关键字声明该变量是在这个文件中才有用。(static int doger = 3;)一个在所有函数之外定义的变量具有文件作用域。

函数作用域,它只适用于goto语句使用的标签, 函数作用域意味着一个特定函数中的goto标签对该函数中的任何地方的代码都是可见的,无论该标签出现在哪一个代码块中。

使用全局变量的时候,编译需要把两个文件一起编译 gcc -o first.c second.c 

C变量有两种存储时期:静态存储时期,动态存储时期。如果一个变量具有静态存储时期,它在程序执行期间一直存在,具有文件作用域的变量具有静态存储时期。

具有代码块的变量一般情况下具有自动存储时期。

函数原型作用域  void change(int *);  适用于函数原型中使用的变量名。从变量到定义处一直到原型的结尾。

栈区(系统来管理内存)是动态变化的。栈区下面有一段空闲的空间。栈是先进先出。高地址向低地址扩展。

高地址(命令行或者环境变量)

堆区(内存需要程序员来负责管理,申请和释放)由低地址向高地址扩展使用。

bss区域 全局变量的未初始化区域。

init data  初始化数据区 全局变量已初始化数据区域。

代码区  指令存放在代码区。该区域权限为只读。共享。被保护区域。

内存分了七个区域

 C语言中让人头痛的指针和内存_虚拟内存

在声明变量的同时给其赋值叫做初始化。 int myint=100;  存放在数据区的常量区。

字面常量存放在数据区(init data区域)

在函数内部声明的变量都存放在栈区。


全局变量和函数返回是另外两种在不同函数中共享数据的机制。全局变量前按照习惯要加一个g。例如:int gmyInt。


return 的作用是返回到函数调用的地方。

变量存放地址图

 C语言中让人头痛的指针和内存_最大的_02