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

目录

  • 前言
  • 指针与函数
    • 函数的返回值为指针
    • 作为函数参数的指针
    • 指针函数可以改变变量的值
  • 数组变量是特殊的指针
  • 指针与const
    • 指针是const
    • 所指是const
  • 指针计算

前言

本次博客内容为指针进阶,在上次指针基础的内容上做了延申
有需求的可以再去看一看上一篇的指针基础
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;
}

作为函数参数的指针

#include
int 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

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

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

这串代码的结果

000000000062FE14
000000000062FE14
6

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

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

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

#include
int 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们调用这个函数时应该给他一个变量的地址;而不是变量本身;具体为什么,参考上述代码

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

#include
int 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;
}

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

000000000062FE1C
p1=000000000062FE1C
p2=000000000062FE1C
k=11

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

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

数组变量是特殊的指针

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

#include
int 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]的相同;

9
9

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

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

#include
int 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;
 } 

运行结果

9
1000

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

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

指针与const

指针是const

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

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

是可以运行的
而`

#include
int 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
代码便可以运行

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

指针计算

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

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

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

#include
int 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循环实现数组的遍历;
玩转指针,手撕c语言——(指针进阶)_第1张图片

你可能感兴趣的