c语言指针应用总结
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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 种形式是等价的:
结构体变量.成员名。
(*指针变量).成员名。
(括号不能省略)
指针变量->成员名。