c语言编程--指针常量、常量指针、空指针、野指针
2014-09-05 16:39
302 查看
1.
如:const int k=5,t=8;
const int *p=&k;
*p=12;(错误) //常量指针指向的内容是常量,不可以赋值
p=&t;(正确) //常量指针的地址可以修改
2.
如:const int k=5,t=8;
int * const p;
*p=12;(正确) //常量指针指向的内容是常量,可以赋值
p=&t;(错误) //常量指针的地址不可以修改
分析:关键看本质是什么,常量指针----本质是指针,则指向内容可以变化,指针常量----本质是常量,则内容可以变化。指针数组和数组指针是一样分析。
3.
因此,必须使用类型转换操作或赋值操作来把 void 指针指向一个具体的数据类型。
p=NULL,就是说:内存单元0x*****不存放任何变量的内存地址。
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),都能够完成这一任务。
函数指针声明形式:
指针函数声明形式:
常量指针:指针所指向的内容不能改变,但是可以改变其所指向的地址。
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 * pvoid真正发挥的作用在于:
(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);
相关文章推荐
- C语言中的常量指针和指针常量
- C语言:常量指针,指针常量,左移,右移
- C语言中常量指针与指针常量区别浅析
- C语言常量与指针
- C语言常量与指针
- C语言编程艺术--C语言中Union类型与指针
- C语言的指针 指针常量 只读 多维数组的指针
- 关于C语言中常量指针和指针常量的一点理解
- C语言中的常量指针与指针常量
- c语言编程---指针、引用
- C语言指针与数组(C专家编程)
- C语言中指向常量的指针和指针常量
- C语言中的常量指针与指针常量
- 关于C语言指针常量
- C语言:指针的三道编程练习
- C语言: 空指针和空指针常量
- [C++][转] C语言:常量指针,指针常量,左移,右移 .
- 关于C语言中函数值传递的巩固,指向指针的指针 【网络编程获取借口列表时,使用了指针的指针的思考】
- 2014-03-12周三C语言和win32编程的指针和定义对比
- C语言中的const用法以及常量指针与指针常量(有口诀!)