资讯专栏INFORMATION COLUMN

玩转指针,手撕c语言——(指针进阶)

genedna / 1191人阅读

摘要:函数的返回值为指针就按照字面意思,指针函数的定义顾名思义,指针函数即返回指针的函数。

前言

本次博客内容为指针进阶,在上次指针基础的内容上做了延申
有需求的可以再去看一看上一篇的指针基础
https://blog.csdn.net/qq_59708493/article/details/120606282
本篇内容建议收藏后反复食用;

指针与函数

前面学习函数学到,函数参数可以为 int、char、float 等,所有操作都只在函数体内有效(除对指针的操作外),那么我们来学习一下指针作为函数参数。

函数的返回值为指针

就按照字面意思,
1.指针函数的定义

顾名思义,指针函数即返回指针的函数。其一般定义形式如下:

类型名 *函数名(函数参数表列);

其中,后缀运算符括号“()”表示这是一个函数,其前缀运算符星号“*”表示此函数为指针型函数,其函数值为指针,即它带回来的值的类型为指针,当调用这个函数后,将得到一个“指向返回值为…的指针(地址),“类型名”表示函数返回的指针指向的类型”。

int s;void mian(){	int *r = sum(10, 9);	printf("10 + 9 + %d", *r);}int *sum(int x, int y){	s = x + y;	return &s;}

作为函数参数的指针

#includeint f(int *p);int main(void){	int i=6;	printf("&i=%p/n",&i);	f(&i);	return 0; }  int f(int *p) { 	printf(" p=%p/n",p); }

输出的结果是一样的

&i=000000000062FE1C p=000000000062FE1C

我们利用上一篇文章中的指针基础再来分析一下这一串代码

#includeint main(void){	int i=6;	int*p=&i;	printf("%p/n",p);	printf("%p/n",&i);	printf("%d/n",*p);	return 0;}

这串代码的结果

000000000062FE14000000000062FE146--------------------------------Process exited after 0.03068 seconds with return value 0请按任意键继续. . .

代码中我们定义int*p=&i
p时指针变量,是一个=&i的地址,或者说p是变量i的指针

再来看一个经典的例子
利用函数交换变量a,b的值

#includeint swap(int*x,int *y);int main(){	int a=7,b=8;	swap(&a,&b);	printf("a=%d,b=%d",a,b);	return 0;}int swap(int*x,int *y){	int t;	t=*x;	*x=*y;	*y=t;	return 0;}

运行结果为

a=8,b=7--------------------------------Process exited after 0.0297 seconds with return value 0请按任意键继续. . .

注:当函数参数为指针时,当我i们调用这个函数时应该给他一个变量的地址;而不是变量本身;具体为什么,参考上述代码

指针函数可以改变变量的值

#includeint f(int *p);int f(int k);int main(){	int a=9;	printf("%p/n",&a); 	f(&a);	f(a);	return 0; }  int f(int *p) { 	printf("p1=%p/n",p); 	*p=11; 	printf("p2=%p/n",p); 	return 0;  } int f(int k){	printf("k=%d/n",k);	return 0;}

可以在你的编译器上运行一下这个程序

000000000062FE1Cp1=000000000062FE1Cp2=000000000062FE1Ck=11--------------------------------Process exited after 0.02982 seconds with return value 0请按任意键继续. . .

有没有很神奇
所以说通过参数为指针的函数可以改变一个变量的值

数组变量是特殊的指针

数组变量本身表达地址(但是数组单元表达的是变量,)
[ ]运算符可以对数组做,也可以对指针做;
例如

#includeint main(){	int a[]={1,2,5,9,63,8,7,3,9,3,8,63,9,5,596,9};	int*p=a;	printf("%d/n",p[3]);	printf("%d/n",a[3]);	return 0; } 

运行结果p[3]和a[3]的相同;

99--------------------------------Process exited after 0.03134 seconds with return value 0请按任意键继续. . .

同样的,*运算符也可以对数组使用

#includeint main(){	int a[]={1000,2,5,9,63,8,7,3,9,3,8,63,9,5,596,9};	int*p=a;	printf("%d/n",p[3]);	printf("%d/n",*a);	return 0; } 

运行结果

91000--------------------------------Process exited after 0.03093 seconds with return value 0请按任意键继续. . .

数组变量是const的指针,所以不能被赋值

指针与const

指针是const

如果定义指针时int* const p
意思是说指针变量p不可以修改
例如

#includeint main(){	int i=33;	int *const p=&i;	printf("%d/n",*p);	i=22;	printf("%d/n",*p); } 

是可以运行的
而`

#includeint main(){	int i=33;	int *const p=&i;	printf("%d/n",*p);	i=22;	printf("%d/n",*p);	p++;	printf("%d",*p); } 

是无法运行的

9	3	E:/PTA/未命名1.cpp	[Error] increment of read-only variable "p"

所指是const

所指是const有两种类型
1.const int *p
2.int const p
他们表达的意思相同
都是指
p不可改变
所以将上面代码的int const p改为int constp
代码便可以运行

#includeint main(){	int i=33;	int const * p=&i;	printf("%d/n",*p);	i=22;	printf("%d/n",*p);	p++;	printf("%d",*p); } 
33226487576--------------------------------Process exited after 0.03231 seconds with return value 0请按任意键继续. . .

指针计算

上一篇指针基础已经讲过大部分指针运算内容
我们再来补充一点东西

p++
取出p所致=指的那个数据来,后将p移到下一个位置
++的优先级高于

我们可以利用*p++完成一些事情

#includeint main(){	int a[]={4,8,8,5,8,52,9,52,8,8,5,8,5,8,0};	int *p=a;	while(*p!=0)	{		printf("%d ",*p);		*p++;	}	printf("/n");	for(p=a;*p!=0;*p++)		printf("%d ",*p);	}

我们可以用while和for循环实现数组的遍历;

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/121851.html

相关文章

  • 手撕C语言进阶---字符串和内存函数(详解+实现+原码)

    摘要:自己实现时返回值可根据实际情况而定源字符串必须以结束。语言中给了一些长度受限的字符串函数,而前面的函数是长度不受限的字符串函数。拷贝个字符从源字符串到目标空间。 目录 字符函数和字符串函数 函数介绍 strlen strcpy strcat strcmp strncpy  strncat s...

    vslam 评论0 收藏0
  • C语言玩转指针——关于指针,你需要掌握的基础知识!

    摘要:如果我们要将的地址保存到中,我们需要我们给指针变量相应的类型。类型的指针是为了存放类型变量的地址这里可以看到,指针的定义方式是类型名指针变量名。如下最后本文介绍的是指针的基础知识,往后还会继续深入讲解指 ...

    zebrayoung 评论0 收藏0
  • C语言玩转结构体——结构体的那点事儿!

    摘要:一结构体的声明与定义结构体的声明结构是一些值的集合,这些值称为成员变量。但是结构体变量的变量名并不是指向该结构体的地址,所以要使用取地址运算符才能获取其地址。因此,结构体传参的时候,要传结构体的地址。 ...

    jeffrey_up 评论0 收藏0
  • 面试官:我们只想要这样的C++工程师

    摘要:今天先奉上一篇关于方向的,,,,前端,测试这些方向的文章随后也会出来,欢迎大家关注呀一什么是研发工程师呢是最贴近底层编程语言。因此大部分公司的核心业务都是用进行开发,工程师掌握着公司最核心最重要的业务体系,有着十分重要的地位。 showImg(https://segmentfault.com/img/bVbv8Cq); 最近好多同学来找就就说,我想找 xxx 方向的工作,我怎么学习呀?...

    cppowboy 评论0 收藏0
  • C语言进阶指针进阶

    摘要:本章节在此基础上,对语言阶段指针进行更深层次的研究。数组指针的类型由数组类型决定,先找出数组的类型去掉名就是类型。相当于数组指针所指向数组的数组名。数组指针指向整个数组,将其看作二维数组并解引用得到一行的首元素,从而遍历访问。 ...

    浠ラ箍 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<