深入理解C指针:从内存空间到变量赋值

需积分: 9 1 下载量 182 浏览量 更新于2024-07-29 收藏 543KB PDF 举报
"深入理解C指针:从变量存储到内存操作" 在C语言中,指针被公认为是相对复杂但极其重要的概念。要掌握C指针,首先需要理解C语言中的“变量”是如何在内存中存储的。变量本质上是在内存中为特定类型的数据预留的一段空间,它们有自己的地址,可以通过这些地址来访问和修改存储的数据。 内存空间是一个连续的数据存储区域,可以想象成电影院的座位,每个座位对应一个编号,就像内存的每一个字节都有一个唯一的地址。内存地址用于标识数据在内存中的位置,便于程序进行读写操作。在C语言中,变量声明如`int i;`和`char a;`会在内存中分配相应的空间,例如`int`类型的`i`通常占据两个字节,而`char`类型的`a`占据一个字节。 变量的命名只是逻辑上的标识,实际的存储是由内存地址来实现的。例如,`i`可能从地址6开始占用两个字节,`a`则从地址8开始占用一个字节。这样的布局使得每个变量都有其独一无二的存储位置。 赋值给变量的过程涉及到内存操作。当执行`i = 30;`时,实际上是将数值30写入到`i`所对应的内存地址中。同样,`a = 't';`会将字符' t '(ASCII码表示)存入`a`的地址中。这里要注意,字符在内存中通常以单字节的ASCII码形式存储。 指针就是变量的地址,它是内存地址的间接引用。声明一个指针变量,如`int *ptr;`,`ptr`是一个可以存储地址的变量,它本身并不存储数值,而是存储数值所在的内存地址。通过指针,我们可以间接地访问和修改原始变量的值。例如,`ptr = &i;`将`i`的地址赋值给`ptr`,之后通过`*ptr = 40;`可以改变`i`的值,因为`*ptr`是对`i`的间接访问。 指针还可以用于动态内存分配,如`int *p = malloc(sizeof(int));`,这会在堆区分配一个`int`大小的内存块,并返回其地址给`p`。动态内存管理允许程序在运行时决定需要多少内存,以及何时释放不再使用的内存。 此外,指针在函数参数传递、数组操作、结构体和联合体中也发挥着关键作用。例如,通过指针作为函数参数,可以修改函数外部的变量状态;通过指针处理数组,可以避免复制整个数组带来的开销;在结构体中,指针可以用来引用结构体成员或整个结构体。 理解C指针涉及到对内存的理解、变量的存储、内存地址的概念、赋值操作、指针变量的声明和使用,以及动态内存管理等多个方面。熟练掌握这些知识点,对于编写高效、灵活的C程序至关重要。
2010-08-24 上传
目 录 前言 ..................................................................................................................................................1 目 录 ................................................................................................................................................2 修订说明...........................................................................................................................................3 A类:规范化............................................................................................................................3 B类:更正................................................................................................................................3 C类:明晰化............................................................................................................................4 D类:编译器............................................................................................................................4 第壹篇 变量的内存实质.................................................................................................................5 1.先来理解C语言中变量的实质..........................................................................................5 2.赋值给变量.........................................................................................................................6 3.变量在哪里?(即我想知道变量的地址).....................................................................7 第贰篇 指针是什么?.....................................................................................................................8 1.指针是什么东西.................................................................................................................8 第叁篇 指针与数组名...................................................................................................................11 1. 通过数组名访问数组元素................................................................................................11 2.通过指针访问数组元素...................................................................................................11 3.数组名与指针变量的区别...............................................................................................12 4.声明指针常量...................................................................................................................13 第肆篇const int *pi与int *const pi的区别...............................................................14 1. 从const int i 说起...................................................................................................14 2. const int *pi的语义..............................................................................................15 3. 再看int *const pi.....................................................................................................16 4.补充三种情况...................................................................................................................18 第伍篇 函数参数的传递...............................................................................................................20 1.三道考题...........................................................................................................................20 2. 函数参数传递方式之一:值传递....................................................................................23 3. 函数参数传递方式之二:地址传递................................................................................26 4. 函数参数传递方式之三:引用传递................................................................................27 第陆篇 指向另一指针的指针.......................................................................................................30 1. 回顾指针概念....................................................................................................................30 2.指针的地址与指向另一指针地址的指针.......................................................................31 3. 一个应用实例....................................................................................................................32 第柒篇 函数名与函数指针...........................................................................................................37 1. 通常的函数调用................................................................................................................37 2.函数指针变量的声明.......................................................................................................38 3.通过函数指针变量调用函数...........................................................................................38 4.调用函数的其它书写格式...............................................................................................39 5.定义某一函数的指针类型...............................................................................................42 6. 函数指针作为某个函数的参数........................................................................................44