您的位置:首页 > 编程语言 > C语言/C++

C语言深度剖析--读书笔记_void 关键字

2013-03-15 12:32 183 查看
void类型的主要作用:限定函数返回类型,限定函数参数类型

1.指针赋值:

(1)两种不同类型的指针,不能直接相互赋值(涉及void类型的除外)

例1:

long *p1;

int * p2;

p1=p2;

警告:从不兼容的指针类型赋值

(2)void类型的指针,可以接受任意类型的指针。但是,不能直接把void指针直接赋值给其他

例2:

void *p1;

int *p2;

p1=p2; // ok ,没有任何问题

p2=p1; //不可以,不能把void类型的指针,直接赋值给 其他类型的指针。

2.void限定函数的返回值类型,和参数类型:

(1)不指定返回值,并不等于,返回值为void。编译器把未制定返回类型,作为返回整型处理。

例3:

func1() //func1函数,并没有制定返回类型

{

return 10;

}

int main()

{

printf("func1 returns a value:%d\n",func1()); //把func1()的返回值,作为int处理了

return 0;

}

打印结果:func1 returns a value:10

(2)函数参数列表为空,不代表该函数不能接受参数(在C中可以)。只有在函数参数列表中,指明void,该函数才被认为不可接受参数。

例4:

func1()

{

return 10;

}

int main()

{

printf("func1 returns a value:%d\n",func1(2)); //注意,这里向func1中传了一个参数..

return 0;

}

打印结果:func1 returns a value:10

函数编译通过,正常执行。这样容易引起误解,函数在定义的时候无参,为何还可以传参。所以在定义函数的时候,如果函数无参,那么要指明参数为void

例5:

func1(void)

{

return 10;

}

int main()

{

printf("func1 returns a value:%d\n",func1(2));

return 0;

}

打印结果:提供给func1函数的参数过多!

3.void指针的运算

首先,ANSI与GNU关于void指针操作,有不同规定。

(1)在ANSI标准中,进行算法操作的指针,必须是确定其所指数据类型大小的。(这里的指针算法操作指:p++,p+=1...)

例6:

void *pvoid;

pvoid++; //报错

在ANSI中,因为不知道pvoid指向何种类型,自然也不知道其所指的对象有多大的内存。这样,pvoid++就没有意义。

(2)在GNU中,它指定void指针的操作,等同与char型指针。

例7:

void *p1;

printf("before ++,p1 is 0x%x\n",p1);

p1++;

printf("after ++,p1 is 0x%x\n",p1);

打印结果:

before ++,p1 is 0xaa0ff4

after ++,p1 is 0xaa0ff5

由上可见,p1++后,地址比之前增加了1。所以,在GNU中,void指针的运算,是按照char规则来处理的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: