Linux整理笔记(3)

一、指针变量的定义

指针变量前面的*”便是该拜纳凉为指针型变量。指针变量名是pointer_1pointer_2,而不是*pointer_1*pointer_2.这是与定义整数或实行变量的形式不同的。在定义指针变量是必须指定基类型。不同类型的数据在内存中所占的自己输和存放方式是不同的。指向一个整型变量和指向一个实型变量在物理意义上是不同的。

二、什么是野指针

野指针即指向一个错误位置的指针。它可能会导致存放在堆中的数据可能会被破坏,用来处理堆的数据结构也可能会被破坏,甚至操作系统的数据也可能会被修改,甚至上述三种破坏情况同时发生。

三、指针的值

指针的值也叫作指针所指向的内存区或地址。指针的值是指针本身存储的数值,这个值被编译器当作一个地址,而不是一个一般的数值。在32位程序里,所有类型的指针的值都是一个32位整数,因为32位程序里的内存地址全都是32位长。指针所指向的内存区就是从指针的值所带表的那个内存地址开始,长度为sizeof的一片内存区。

四、什么是“指向”

地址就意味是指向,因为通过地址能找到具有该地址的对象。对于指针来说,把谁的地址存放在指针变量中,就是此指针变量指向谁。但并不是任何类型数据的地址都可以存放同一个指针变量中的,只有与指针变量的基类型相同的数据的地址才能存放在相应的指针变量中。

五、指针常量和常量指针

常量指针指向的内容不可变,但地址可以改变,即指针可以指向别的地址;而指针常量是指指针本身不可变,而内容可以修改。如果指针常量指向的是字符指针,变量那么当前修改*p时,原则上能够修改,在编译是能通过,但在运行时不能通过,因为它试图改常量区的内同,显示是非法的。当指针常量指向一个另外指针时,当这个指针指向别的内容时,那么指针常量还是指向原先的内容。

六、形参和实参的数据传递(指针)

C语言中实参变量和形参变量之间的数据传递是单向的“值传递”,方式。用指针变量做函数参数时同样要遵循这一规则。不可能通过执行调用函数来改变实参指针变量的值,但是可以改变实参指针变量所指的值。(函数的调用可以得到一个返回值,而使用指针变量做参数,可以得到多个变化了的值。如果不用指针变量是难以做到这点的)。

七、字符指针作函数参数

如果把一个字符串从一个函数,可以用地址传递的办法,急用字符数组名作参数,也可以用字符指针变量做参数。在被调用的函数中可以改变字符串的内容,在主调函数中可以引用改变后的字符串。

八、字符指针变量和字符数组

(1)字符数组由若干个匀速组成,每个元素中放一个字符,而字符指针变量中存放的是地址,绝不是将字符串放到字符指针变量中。

(2)可以对字符指针变量赋值,但不能对数组名赋值。

(3)编译时为字符数组分配若干存储单元,一存放各元素的值,而对字符指针变量,只分配一个存储单元。

(4)指针变量的值可以改变的,而字符数组名代表一个固定的值,不能改变。

九、什么是函数的指针

如果在程序中定义了一个函数,在编译时会把函数的源代码转换为可执行代码并分配存储空间。这段内存空间有一个起始地址,也称为函数的入口地址。每次调用函数时都从该地址入口开始执行此段函数代码。含宿命代表函数的起始地址。调用函数时,从函数名得到函数的起始地址,并执行函数代码。函数名就是函数的指针,它代表函数的起始地址。

十、如何定义和使用指向函数的指针变量

判定指针变量是指向函数的指针变量,首先看变量名的前面有无*”号。如果有,肯定是指针变量而不是普通变量。其次,看变量名的后面有无圆括号,内有形参的类型。如果有,就是指向函数的指针变量,这圆括号是函数的特征。要注意的是:由于优先级的关系,“*指针变量名”要用圆括号括起来。

定义指向函数的指针变量,并不意味着这个指针变量可以指向任何函数,它只能指向在定义时指定的类型的函数。如果要用指针调用函数,必须先使指针变量指向该函数。在给函数指针变量赋值时,只需给出函数名而不必给出参数。用函数指针变量调用时,只需将(*p)代替函数名即可,在(*p)之后的括号中根据需要写上实参。用函数名调用函数,只能调用所指定的一个函数,而通过指针变量调用函数比较灵活,可以根据不同情况先后调用不同的函数。

你可能感兴趣的:(Linux整理笔记(3))