高级指针与高级结构体的解析(很经典的!)
a、存放地址的变量叫指针变量,那我们怎么知道它是不是存放着地址呢?通过“*”来标识。
b、(void*)类型的指针叫通用指针,可以指向任何变量。C语言允许直接把任何变量的地址最为变量赋给通用指针。这点很重要的!具体的一个例子是:
c、变量的地址就是指针,存放指针的变量就是指针变量。一个变量的地址成为该变量的指针。
下面讲解一些很有用的表达,这对于阅读内核有很大的好处。
咱们先从简单地说起。int
接下来说这个表达式:int
举个简单地例子:
#include<stdio.h>
int
{
int z=0;
int k=1;
if (x>y)
return &z;
else
return &k;
}
int main(void)
{
int *p;
int x=1,y=2;
p=getvalue(x,y);
printf(“%d”,*p);
}
再看这一个定义:int
现在看下一个定义:int
现在讲一下函数指针,指针函数,指针数组,数组指针的区别吧。
比如:int
int
int
那么函数指针与指针函数与此类似,教大家一个比较好记的办法,不容易混淆的:先执行的在后面,而且本质都是先执行的。什么意思呢?拿第一个例子来说,p[3]先执行,即数组先执行,所以称呼时排在后面,先执行的是数组,那么本质就是数组了。这个办法稍加理解就很容易记住了!
到了这里忽然想起一句话,在上次那篇文章《浅析c语言函数调用》中提到交换两个数必须用指针传址调用,那时被调用函数的参数是一个指针(地址),所以被调用函数希望传递过去的是地址,在主函数的调用形式中才会有swap(&x,&y)这一句话。所以说被调用函数的参数是什么,或者说她需要传递什么时,调用函数就应该传递什么!!!
现在我自认为比较困难的结构体,这知识在linux内核中几乎占了一大半的,只要是某个数据,它的定义就离不开结构体,而且引用时也都是些相当常见的结构。至于这个下次再讲,未完待续。。。。。