- 前言
- 指针与函数
- 函数的返回值为指针
- 作为函数参数的指针
- 指针函数可以改变变量的值
- 数组变量是特殊的指针
- 指针与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;
}
作为函数参数的指针
#includeint f(int *p); int main(void) { int i=6; printf("&i=%pn",&i); f(&i); return 0; } int f(int *p) { printf(" p=%pn",p); }
输出的结果是一样的
&i=000000000062FE1C p=000000000062FE1C
我们利用上一篇文章中的指针基础再来分析一下这一串代码
#includeint main(void) { int i=6; int*p=&i; printf("%pn",p); printf("%pn",&i); printf("%dn",*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的值
#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("%pn",&a); f(&a); f(a); return 0; } int f(int *p) { printf("p1=%pn",p); *p=11; printf("p2=%pn",p); return 0; } int f(int k) { printf("k=%dn",k); return 0; }
可以在你的编译器上运行一下这个程序
000000000062FE1C p1=000000000062FE1C p2=000000000062FE1C k=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("%dn",p[3]); printf("%dn",a[3]); return 0; }
运行结果p[3]和a[3]的相同;
9 9 -------------------------------- 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("%dn",p[3]); printf("%dn",*a); return 0; }
运行结果
9 1000 -------------------------------- 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("%dn",*p); i=22; printf("%dn",*p); }
是可以运行的
而`
#includeint main() { int i=33; int *const p=&i; printf("%dn",*p); i=22; printf("%dn",*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("%dn",*p); i=22; printf("%dn",*p); p++; printf("%d",*p); }
33 22 6487576 -------------------------------- 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循环实现数组的遍历;



