高级指针与高级结构体的解析

本文详细解读C语言中的指针变量、通用指针、指针数组等概念,通过实例展示了如何使用指针进行内存操作,以及在函数调用、函数指针和结构体应用中的运用。重点阐述了指针与结构体在编程中的关键作用及其实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

高级指针与高级结构体的解析(很经典的!)

a、存放地址的变量叫指针变量,那我们怎么知道它是不是存放着地址呢?通过“*”来标识。

b、(void*)类型的指针叫通用指针,可以指向任何变量。C语言允许直接把任何变量的地址最为变量赋给通用指针。这点很重要的!具体的一个例子是:

c、变量的地址就是指针,存放指针的变量就是指针变量。一个变量的地址成为该变量的指针。

下面讲解一些很有用的表达,这对于阅读内核有很大的好处。

咱们先从简单地说起。int *k:定义一个指向整型的指针,k是指针变量,这是对于它本身属性来讲,但上面的定义是k是一个指向整型的指针,为什么k有两种说法?请注意,这并不矛盾,只是这两种说法的立足点不一样而已。K是一个指针变量是它的本质,本质是一个变量,只是加上指针而已。但它里面存的值是一个地址(指针),什么样的指针呢?指向整型的指针。所以两个说法一个是从本质上讲,一个是从存储的值讲。所以加上“*”就成了一个整数了(当然前提是k初始化了),加上之后是一个表达式的。

接下来说这个表达式:int  *f()(咱们先忽略掉里面的参数),如果没有前面的“*”号,就表示先函数调用后,返回一个整型值。现在加上这个符号,我们将其拆开成:  k=f();int  *k;这样看起来就很简单明白了。先函数调用返回一个值,是什么值呢?根据后面的定义式一个指向整型的指针(地址)。如果以后在主函数里想引用它,怎么用呢?记住这是一个地址,用时必须间接访问才行。

举个简单地例子:

#include<stdio.h>

int  *getvalue(int x,inty)

{

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  (*f)(),根据优先级可知先执行前面的括号,即f成为一个函数指针(我们在后面会总结比较),与指针变量不一样的是它指向的是一个函数的入口地址,再通过这个地址进行执行。返回一个整型值。说得明白点,f是一个函数指针(地址),通过前面的“*”进行解引用得到函数的入口地址,再有后面的括号进行函数调用。调用完后返回一个整型值,够清楚了吧!

现在看下一个定义:int *argv[],是不是很熟悉啊?这在linux中是表示命令行参数。那么这是一个什么呢?这叫指针数组。(以后还会有数组指针)下标优先级大于解引用,argv[]是一个数组,它的元素类型是一个指向整型的指针。比如int *argv[1],这和int *k不是一样吗?只不过变成数组元素而已,呵呵。。。。。

现在讲一下函数指针,指针函数,指针数组,数组指针的区别吧。

比如:int *p[3],指针数组,表明该数组的内容都是指针,本质是数组。例子是:int  a=10,b=20,c=30;int *p[3]={&a,&b,&c};

int (*p)[3],数组指针,是一个指向数组首元素的指针,本质是指针(地址),此数组的三个元素都是整型值。例子:int a[3]={1,2,3};

int (*p)[3]=&a;

那么函数指针与指针函数与此类似,教大家一个比较好记的办法,不容易混淆的:先执行的在后面,而且本质都是先执行的。什么意思呢?拿第一个例子来说,p[3]先执行,即数组先执行,所以称呼时排在后面,先执行的是数组,那么本质就是数组了。这个办法稍加理解就很容易记住了!

到了这里忽然想起一句话,在上次那篇文章《浅析c语言函数调用》中提到交换两个数必须用指针传址调用,那时被调用函数的参数是一个指针(地址),所以被调用函数希望传递过去的是地址,在主函数的调用形式中才会有swap(&x,&y)这一句话。所以说被调用函数的参数是什么,或者说她需要传递什么时,调用函数就应该传递什么!!!

现在我自认为比较困难的结构体,这知识在linux内核中几乎占了一大半的,只要是某个数据,它的定义就离不开结构体,而且引用时也都是些相当常见的结构。至于这个下次再讲,未完待续。。。。。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值