目录
紧接上期小编分享的指针在非函数当中的使用,这期小编为大家带来指针在 函数传址调用 与 数组传参 中的应用。
一.传址调用
1.何时用?
对于涉及形参修改实参的情况,我们使用传址调用。把地址给你,就可以远程操控。
2.如何用?(通过例题分析)
题目:写一个函数可以交换2个整型变量的内容。
#include<stdio.h>
void Swap(int* pa, int* pb)
{
int tmp = *pa;
*pa = *pb;
*pb = tmp;
}
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
printf("交换前:%d %d\n", a, b);
Swap(&a, &b);// 传地址!
printf("交换后:%d %d\n", a, b);
return 0;
}
我们分别用指针变量 pa pb 来接收 a b 的地址,类型为整型,用 int*
找到了 a b 的地址,用 * 解引用操作符来操控 a b ,实现远程操控的效果。不需要返回值,所以函数类型用 void
是否发现指针用起来顺手很多呢?
二.数组传参
这里我们要提前知道一个结论:数组名其实是首元素的地址
1.指针接收
例题:模拟实现 strlen (计算字符串长度)
int my_strlen(char* str)//返回类型为整型,函数类型用 int
{
int count = 0;
return count;
}
int main()
{
char arr[] = "abc";
//[a b c \0]
int len = my_strlen(arr); //定义变量用于接收函数返回值
printf("%d", len);
return 0;
}
由结论知:数组名是 b 的地址,b 的地址是字符的地址,字符的地址应该放到字符指针当中,所以接收类型要用 char*
定义和接收都搞定了,怎么用呢? 下面是调用函数中间缺失的几行代码
while (*str != '\0')
{
count++;
str = str + 1;
}
先来看 *str 是什么意思:
地址是首格的编号,存到 str 中 ,str 就是个指针变量
str 里面存的是这个位置的地址,*str 是 str 指向的空间,即 a
用一幅图来理解:
2.数组接收
下面这段代码,数组传参,数组接收,你是否认为这更加合理呢?
void my_strlen(char str[])
{
int r = sizeof(str);
}
int main()
{
char arr[] = "abcdef";
int sz = sizeof(arr);
my_strlen(arr);
printf("%d", sz);
return 0;
}
代码打印出sz=7
可进入函数内调试呢?
void my_strlen(char* str)
{
int r = sizeof(str);
}
如果这样写,r 还是 4 。 为什么呢?
因为在这里,sizeof 计算的是指针变量的大小,str 是指针变量,sizeof(str)在x86下为4,x64下为8 。 跟字符串没有关系(自己以为是在计算字符串所占空间大小)
想要在调用函数中计算数组大小,用 strlen
3.总结
数组传参传数组名的话,传过去的就是地址,所以这本质就应该是指针(只是看着像数组)
因为指针才能接收传过来的地址
所以即使写成数组的形式,这个地方依然不能用sizeof
4.指针,数组接收对照写法(例题)
例题:写一个函数 reverse_str 实现字符串逆序(不是逆序打印!)
思路:左右两端不断交换
(1)指针接收写法
void reverse_str(char* str)
{
int l = 0; //是L的小写,不是数字1
int r = strlen(str)-1;
while (l < r)
{
char tmp = *(str + l);
*(str + l) = *(str + r);
*(str + r) = tmp;
l++;
r--;
}
}
int main()
{
char arr[] = "abcdef";
reverse_str(arr);
printf("%s", arr);
return 0;
}
(2)数组接收写法(只写函数调用部分)
void reverse_str(char str[])
{
int l = 0;
int r = strlen(str)-1;
while (l < r)
{
char tmp = str[l];
str[l] = str[r];
str[r] = tmp;
l++;
r--;
}
}
(3)相互使用(本质相同)
void reverse_str(char* str)
{
int l = 0;
int r = strlen(str)-1;
while (l < r)
{
char tmp = str[l];
str[l] = str[r];
str[r] = tmp;
l++;
r--;
}
}
5.总结
arr [ i ] 等价于 * (arr + i)
本篇的分享就到这里了,感谢观看,如果对你有帮助,别忘了点赞+收藏+关注。
小编会以自己学习过程中遇到的问题为素材,持续为您推送文章。