c语言指针应用总结

一、指针指向变量:(一般指针)

下面有这样一个代码块:

int  main()

{int a=10;int b=15;test(a,b);printf("a=%d,b=%d\n",a,b);}

void test(int  x,int y)

{int tmp;tmp=x;x=y;y=tmp;}

最后输出的结果还是a=10,b=15。

因为在函数调用时,实参和形参之间只是值传递。

但我们使用指针结果就不一样了,如:

int  main()

{int a=10;int b=15;test(&a,&b);printf("a=%d,b=%d\n",a,b);return 0;}

void test(int * x,int *y)

{int tmp;tmp=*x;*x=*y;*y=tmp;}

输出结果a=15,b=10。变量a和b的值发生了交换。

这是因为我们利用指针访问变量的存储单元,间接修改变量的值。

/*函数体内的AB和函数体外的AB是不同的变量,程序运行时体外函数的值传递到函数体内,但体外AB的值没有发生改变,经过引用函数的运算,函数体内的AB值发生了变化,函数引用完毕后体内AB销毁,但体外AB的值并未发生变化。而函数直接引用体外变量的指针值(*p)进行运算,会对体外被引用变量的值产生改变。*/

-------------------------------------------------------------------------------------------------------------------------------------

二、指针指向数组(数组指针)

定义一个数组并初始化,int array[5]={2,5,12,7,8},定义一个指针变量并把数组的地址赋给它,int *p=array,注意数组名就是数组的地址,而且数组的地址就是首元素的地址。

因此我们的指针变量就指向了数组的首元素,*p=2。如果把(p+1),那么指针变量就指向了数组的下一个元素5,因此我们可以利用指针来遍历数组的各个元素:

int  main()

{int array[5]={2,5,12,7,8};int *p =array;for(int i=0;i<5;i++){printf("array[%d]=%d\n",i,*(p+i));}return 0;}

/*数组指针可以通过值运算(*p++)或*p++和地址运算p++直接操作数组元素,int a=a[];int *p; *p=a 则 *p=a[0]       */

-------------------------------------------------------------------------------------------------------------------------------------

三、指针指向字符串(字符串指针)

我们都知道用数组存储字符串,如char name[20]="jack",上面已经简单讲述了指针指向数组,所以我们可以这样做,char *name="jack",指针变量指向字符串的首个字符并可以依次访问字符串的各个字符。

//数组指针可以通过值运算(*p++)或*p++和地址运算p++直接操作字符和字符串,类似于数组指针

// 注意:(*p)++是对*p 的值进行++运算

-------------------------------------------------------------------------------------------------------------------------------------

四、指针指向函数(函数指针)

我们需要知道怎样表示一个指针指向函数,说白了就是语法要正确,下面我也取一个代码块来说明一下:

int sum(int x,int y)

{return x+y;}

int main()                                                   //定义一个函数

{

int a=5;int b=6;

int (*p)(int,int);                                         //定义一个函数指针,(*p)()是函数指针的标志。

p=sum;              

 /*指针赋值,这个值就是指向的这个函数。这个和一般指针赋值有所区别,类似于数组名相当于首地址的意思,可以不用取址符&         函数名(SUM )本身有指向函数首地址指针的意义                 */

int result=(*p)(a,b);

printf("The result is %d\n",result);return 0;

}

不难发现上面代码块里语句(*p)(a,b)可以用 p(a,b) 来代替,因为p和sum就是一样的,可以通用,只是用前者可能更容易理解一点。

而我们要知道怎样定义一个指针指向函数,int (*p)(int,int)这是固定写法,前面的int是指针将来指向的函数的返回值的类型,如果没有函数返回值,那就是void,后面括号里的两个int当然就是指针将指向的函数的形参。

/*函数指针的意义

1. 便于分层设计:函数指针是引用,是间接层,或曰隔离层。它输出到上层,给上层用户用。函数实体是实现,在下层,给开发者用,实现者(软件工程师)关注。这就是简单的分层的概念了。上层用户想让一个函数所做的东西会变化时,我们只需要改变底层实现,并用函数指针指向新的实现就行了。

再精炼一下分层:分层的核心是对接口进行设计和实现。函数指针的作用就是提供不同实现的统一接口。

2. 利于系统抽象:只有存在多个类似的实体需要模拟、操作或控制时(这种情况很多)才需要抽象。多个类似的实体就是对象,抽象的结果就是类。在C里边,可以用函数指针数组完成这种抽象。如, fopen 就是一个例子。他可以打开文件。C里面将磁盘文件、串口、USB等诸多设备抽象为文件。

3. 降低耦合度以及使接口与实现分开:第1条中的解释已经说明了这一点。

*/

 

5、指针指向结构体:

我们首先首先定义一个结构类型,

struct student

{char *name;

int  ages;};

再根据类型定义结构体变量struct student stu={"Rose",15};

定义一个指针指向结构体类型,struct student *p;把结构体变量stu的地址赋给指针变量p,p=&stu;

我们可以有3种方式来访问结构体中的属性ages:stu.ages=15;(*p).ages=15;p->ages=15;不过第三种方式在C语言中只能用来指向结构体。

以下 3 种形式是等价的:

  • 结构体变量.成员名。

  • (*指针变量).成员名。(括号不能省略)

  • 指针变量->成员名。

  •  

转载于:https://www.cnblogs.com/gougouwang/p/11401431.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值