c语言编程--指针常量、常量指针、空指针、野指针

1.

常量指针:指针所指向的内容不能改变,但是可以改变其所指向的地址。

const 类型 *指针常量名=&变量名;
如:const int k=5,t=8;
const int *p=&k;
*p=12;(错误) //常量指针指向的内容是常量,不可以赋值
p=&t;(正确) //常量指针的地址可以修改

2.

指针常量:指针所指向的地址不能改变,但是可以改变其所指向的


类型 * const  指针常量名=&变量名;
如:const int k=5,t=8;
int * const p;
*p=12;(正确) //常量指针指向的内容是常量,可以赋值
p=&t;(错误) //常量指针的地址不可以修改

分析:关键看本质是什么,常量指针----本质是指针,则指向内容可以变化,指针常量----本质是常量,则内容可以变化。指针数组和数组指针是一样分析。

3.

空指针(void pointers)

  void 指针可以指向任意类型的数据。唯一的限制是被指向的值不能被直接引用(即不可以对它们使用解引符*),因为它的长度是不定的。

  因此,必须使用类型转换操作或赋值操作来把 void 指针指向一个具体的数据类型。


p=NULL,就是说:内存单元0x*****不存放任何变量的内存地址。

空指针是一个特殊的指针值,也是唯一一个对任何指针类型都合法的指针值。指针变量具有空指针值,表示它当时处于闲置状态,没有指向有意义的东西。空指针用0表示,C语言保证这个值不会是任何对象的地址。给指针值赋零则使它不再指向任何有意义的东西。为了提高程序的可读性,标准库定义了一个与0等价的符号常量NULL.    程序里可以写 p = 0;     或者 p = NULL; 两种写法都把p置为空指针值。相对而言,前一种写法更容易使读程序的人意识到这里是一个指针赋值。

无类型指针 void * p

void几乎只有“注释”和限制程序的作用,定义一个void变量没有意义。

  void真正发挥的作用在于:


  (1) 对函数返回的限定;


  (2) 对函数参数的限定。

void的作用
对函数返回的限定。
对函数参数的限定。
当函数不需要返回值时,必须使用void限定。例如: void func(int, int);
当函数不允许接受参数时,必须使用void限定。例如: int func(void)

由于void指针可以指向任意类型的数据,亦即可用任意数据类型的指针对void指针赋值,因此还可以用void指针来作为函数形参,这样函数就可以接受任意数据类型的指针作为参数。例如:
void * memcpy( void *dest, const void *src, size_t len );
void * memset( void * buffer, int c, size_t num);

 规则三小心使用void指针类型
  按照ANSI(AmericanNationalStandardsInstitute)标准,不能对void指针进行算法操作,即下列操作都是不合法的:
void * pvoid;
pvoid ++;//ANSI
:错误
pvoid += 1;//ANSI
:错误
  规则五void不能代表一个真实的变量
  下面代码都企图让void代表一个真实的变量,因此都是错误的代码:
void a;//
错误
function(void a);//
错误
  void体现了一种抽象,这个世界上的变量都是“有类型”的,
  void的出现只是为了一种抽象的需要,如果你正确地理解了面向对象中“抽象基类”的概念,也很容易理解void数据类型。正如不能给抽象基类定义一个实例,我们也不能定义一个void(让我们类比的称void为“抽象数据类型”)变量。

判断指针是否为空的问题.很显然,if (p == NULL), if (p == 0)和if(p),都能够完成这一任务。

函数指针(Pointers to functions)

  函数指针即指向函数的指针。它最大的作用是把一个函数作为参数传递给另外一个函数。

  函数指针声明形式:

int (*f)(int, int);

指针函数(Pointers of functions)

  指针函数即函数的返回值为指针。

 指针函数声明形式:

int * f(int, int);


你可能感兴趣的:(计算机基础,linux/unix,C/C++)