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

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

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

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

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  初始化数据区 全局变量已初始化数据区域。

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

内存分了七个区域

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

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

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

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

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

变量存放地址图

时间: 2024-08-06 05:08:54

 C语言中让人头痛的指针和内存的相关文章

C 语言中有趣第指针操作(转)

http://blog.csdn.net/ghevinn/article/details/37651149(反汇编题目需要分析) 4.取出内存区域的值 在取某内存地址开始的一个区域的值的时候,取出的值取决于用来取值的类型,譬如int为4个byte,char为1个byte,程序如: void main(){ int a[2] = {261,0}; int *pi = a; char *p = (char*)pi; cout << *(int *)p++ << endl;  //取出p

c语言中结构体指针

1.指向结构体的指针变量: C 语言中->是一个整体,它是用于指向结构体,假设我们在程序中定义了一个结构体,然后声明一个指针变量指向这个结构体,那么我们要用指针取出结构体中的数据,就要用到指向运算符"->". 举例说明: struct SunLL { int a; int b; int c; }; struct SunLL  * p;               //定义结构体指针 struct SunLL A = {1,2,3};    //定义一个SunLL类型的变量A

C语言中数组与指针

数组是内存空间的一片连续的区域,用于存贮一组相同数据类型元素的集合. 指针变量中存放的是变量的地址,通过指针取得地址,再通过地址提取数据. 在大多是C语言书中,都有这样的说法,“数组和指针是相同的”.其实,数组与指针,只能在特定的情况下才是相同的,在大多书情况下,他们并不相同. C语言中每个表示变量的符号都代表一个地址,而每个变量的值就是该地址里所存储的内容. 定义一个字符数组 char a[]="asdfghjkl";现在来访问第i个字符a[i],编译器符号表中具有一个符号,它代表的

C语言中函数和指针的参数传递

最近写二叉树的数据结构实验,想用一个没有返回值的函数来创建一个树,发现这个树就是建立不起来,那么我就用这个例子讨论一下c语言中指针作为形参的函数中传递中隐藏的东西. 大家知道C++中有引用的概念,两个数据引用同一个数据,那么更改任意的一个都相当于更改了本体,那么另一个数据所对应的值也会改变,可是C中是没有这个概念的.所以就产生了一些东西.和我们本来想的有差别. 一.明确C语言中函数的入口: C语言中函数的形参负责接收外部数据,那么数据究竟怎么进入函数的呢,其实我们在函数体内操作的形参只是传递进来

1、C语言中的函数指针

一 通常的函数调用 1 void MyFun(int x); //此处的申明也可写成:void MyFun( int ); 2 3 int main(int argc, char* argv[]) 4 { 5 MyFun(10); //这里是调用MyFun(10);函数 6 7 return 0; 8 } 9 10 void MyFun(int x) //这里定义一个MyFun函数 11 { 12 printf("%d\n",x); 13 } 这个MyFun函数是一个无返回值的函数,它

C语言中的二级指针(双指针)

原创作品,转载请标明出处http://blog.csdn.net/yming0221/article/details/7220688 C语言更多查看 C语言使用注意事项(一) C语言使用注意事项(二) C语言使用注意事项(三) 二级指针又叫双指针.C语言中不存在引用,所以当你试图改变一个指针的值的时候必须使用二级指针.C++中可以使用引用类型来实现. 下面讲解C中的二级指针的使用方法. 例如我们使用指针来交换两个整型变量的值. 错误代码如下: 一级指针 [cpp] view plaincopyp

策略设计模式与c语言中的函数指针

在C语言中有一个非常重要的概念-函数指针,其最重要的功能是实现回调函数(指函数先在某处注册,而它将在稍后某个需要的时候被调用)在java语言中没有指针的概念,但是可以利用接口和指针实现类似的功能,具体而言,应先定义一个接口,最后把这个实现类的一个对象作为参数传递给调用程序,调用程序通过这个参数来调用指定的函数,从而实现回调函数(这里接口就像是注册的地方,实现类就是“注册人”,当实现类作为形参时,就是在需要的时候) package strateryDemo; import java.util.Ar

C语言中的编译时分配内存

1.栈区(stack) --编译器自动分配释放,主要存放函数的参数值,局部变量值等: 2.堆区(heap) --由程序员分配释放: 3.全局区或静态区 --存放全局变量和静态变量:程序结束时由系统释放,分为全局初始化区和全局未初始化区: 4.字符常量区 --常量字符串放与此,程序结束时由系统释放: 5.程序代码区--存放函数体的二进制代码 例: //main.c int a=0; //全局初始化区 char *p1; //全局未初始化区 void main() { int b; //栈 char

c语言中数组,指针数组,数组指针,二维数组指针

1.数组和指针 int array[5] = {1,2,3,4,5};// 定义数组 // 1. 指针和数组的关系 int * pa = array; pa = array; // p[0] == *(p+0) == array[0] == *(array+0) printf("%p\n", pa); printf("%p\n", array); /* 访问数组两种方式 1. 下标法访问 数组名[下标] 指针[下标] 下标:偏移量 2. 指针法访问 *(p+1) *