学习笔记(5):C程序设计(第四版)谭浩强著_第八章

来源:互联网 发布:阿里移动推荐算法大赛 编辑:程序博客网 时间:2024/06/15 07:59
内存地址:内存区的每一个字节有一个唯一的编号,称为内存地址。
通过地址查找所需的变量单元,称为地址指向该变量单元,将地址形象化的称为“指针”。指针是一个地址,指针变量是存放地址的变量

直接访问:通过变量名访问变量。
间接访问:将变量1的地址存放在变量2中,通过变量2来查找变量1的地址,从而访问变量1。

定义指针变量:
    类型名* 指针变量名;
    定义的指针变量的类型,表明了它可以指向的变量的类型。必需知道所指向的变量的类型,才能根据存储单元的长度以及数据的存储形式将变量正确取出。

引用指针变量
    (1) 给指针变量赋值:p=&a;   p的值是a的地址,p指向a。
    (2) 引用指针变量所指向的变量:*p就指代变量a本身。
    (3) 引用指针变量的值:将p当做地址直接引用,如printf("%o", p)可以打印a的地址。
    
    如果想通过函数调用得到n个要改变的值,可以这样做:
    ① 在主调函数中设n个变量,用n个指针变量指向它们;
    ② 设计一个函数,有n个指针形参,在这个函数中改变n个形参的值;
    ③ 在主调函数中调用这个函数,在调用时将这n个指针变量做实参,将它们的地址传给该函数的形参;
    ④ 在执行该函数的过程中,通过形参指针变量改变它们所指向的n个变量的值;
    ⑤ 在主调函数中使用改变了值的变量。
    
用指针引用数组
    数组名就是指向数组中首元素的指针,是一个指针型常量,在程序运行期间不能被改变。在指针指向数组元素时,可以对指针进行如下运算:
    (1) 加一个整数,或自加;
    (2) 减一个整数,或自减;
    (3) 两个指针相减(只有在两个指针都指向同一数组中的元素时才有意义)。
    
    引用数组元素的3种方法:下标法;通过数组名计算元素地址进而得到元素;用指针变量指向数组元素。

    效率比较:方法1和方法2效率相同,C编译系统是将元素下标如a[i]转化为*(a+i)处理的,是先计算元素地址,因此费时较多。而用指针变量指向元素,不必每次都重新计算元素地址,大大提高执行效率。但是用下标法比较直观,好理解。

    

    实参数组名是代表一个固定的地址,是一个指针常量;但形参数组名并不是固定的地址,可以按指针变量进行处理,在被调函数执行期间可以被重新赋值。 


    用指针引用多维数组:*(a[i]+j)或*(*(a+i)+j)都等同于a[i][j]的值。
    
用指针引用字符串
    可以把字符指针变量看做是一个数组名,字符指针变量实际上是存放字符串的字符数组的首元素地址。所不同的是,可以通过字符数组名或字符指针变量输出一个字符串,而对于一个数值型的数组,不能用数组名输出它的全部元素。
    
    定义一个字符指针变量之后,应当及时对其进行初始化,如果未对它赋予地址值,其将指向一个不确定的对象,会出现严重后果。
    
用指针调用函数
    首先定义一个指向函数的指针变量,然后就可以用其调用函数。
    定义指向函数的指针变量:
    类型名 (*指针变量名)(函数参数表列);
    被定义的函数指针变量只能指向在其定义时指定的类型的函数,如果int (*p)(int,int),p只能指向函数返回值为int,且有两个int型参数的函数。用指针调用函数前,必须先使指针变量指向该函数,如p=max,则p得到了max函数的入口地址。在给函数指针变量赋值时,只需给出函数名而不用给出函数参数。在用函数指针变量调用函数时,将*p代替函数名即可,此时需要带实参。对函数指针变量进行的算数运算是无意义的。
    
指针数组
    一维指针数组的定义:类型名* 数组名[数组长度];
    适合用在需要指向多个不等长的字符串时。
    
    指向指针数据的指针变量:类型名** 变量名;
    例如,一维指针数组名就是一个指向指针数据的指针变量。
    
在main函数中使用参数
    当程序需要从命令行中获取参数时,就要在main函数中使用参数。
    int main(int argc, char* argv[])
    argc是命令行中参数的个数,文件名也作为一个参数。argv是一个指向字符串的指针数组,存放具体的命令。
    
动态分配内存与指向它的指针变量
    栈:存放非静态的局部变量(包括形参),是内存中的动态存储区。
    堆:存放临时用的数据,不必在程序的声明部分定义,不必等到程序结束时才释放,需要时随时开辟,不需要时随时释放。
    
    malloc函数:在内存的动态存储区中分配一个长度为一定字节数的连续空间,若成功则返回值是所分配区域的第一个字节的地址,不成功则返回NULL。
    calloc函数:在内存的动态存储区中分配n个长度为一定字节数的连续空间,这个空间一般比较大,足够保存一个数组。成功则返回指向所分配区域的起始位置的指针,失败则返回NULL。
    free函数:释放指针变量所指向的动态空间,其参数是一个指针变量,应当是最近一次调用calloc或malloc时得到的返回值。free函数无返回值。
    realloc函数:如果已经通过malloc或calloc得到了动态空间,想调整其大小,则可以使用realloc重新分配。
    上述4个函数在使用前需要在程序中声明stdlib.h头文件。


    
原创粉丝点击