再识C语言 DAY15 【指针(中)理论结合实践】
文章目录
- 前言
- 一、补充
- 二、数组与指针
- 指针运算
- 注意事项
- 指针的应用
- 传递参数(指针的间接访问)
- 指针输出参数
- 如果您发现文章有错误请与我留言,感谢
前言
本文章总结于此视频
一、补充
指针即指针变量,用于存放其他数据单元(变量/数组/结构体/函数等)的首地址。若指针存放了某个数据单元的首地址,则这个指针。指向了这个数据单元,若指针存放的值是0,则这个指针为空指针。
如图所示:
另外,在一个系统上指针所占用的字节是确定不变的
我们这里使用的64位系统都是占八个字节,这是一个很关键的信息
二、数组与指针
数组与指针可以说是非常相似,数组是一些相同数据类型的变量组成的集合,其数组名及为指向该数据类型的指针。当你在写一个数组arr[]不写[ ],此时的arr就等效于指针,
如图所示
我们尝试一下
指针运算
当然,这里也涉及到了运算
注意:如果只是一个单独的变量就不要使用加或减,因为此时会指向非法的区域
我们可以取变量的地址来直观的学习
我们可以直观地观察到他们的不同,int数据类型的地址增加了四个字节char数据类型的地址增加了一个字节
所以为什么要移动一个数据类型的长度,我们前面知道指针记录的是首地址,实际上他们的类型是int 和char,我们可以想想对于int类型的数组,比如说他第一个数据地址是1,2,3,4,如果他只移动一个地址,那么你认为第二个数的地址是2,3,4,5,但实际上第二个数的地址是5,6,7,8
在这里插入图片描述](https://img-blog.csdnimg.cn/direct/f4c04b3e7311476db2956159641522b0.jpeg#pic_center)
图片出处
如上图所示表示数组中5个元素在内存中的存储,其中p1指向第一个元素的地址,p2表示第五个元素的地址,代码中用p2-p1,就表示的是两个指针之间的元素个数,很清楚的看到是4个元素,所以打印出来结果为4
注意事项
• 在对指针取内容之前,一定要确保指针指在了合法的位置,否则将会导致程序出现不可预知的错误
•同级指针之间才能相互赋值,跨级赋值将会导致编译器报错或警告
什么是同级指针
比如说变量在和指针之间赋值时,当变量加上取地址&,就是正确的,或者指针加上*
如果不是同级指针,赋值时将会报错。
int a=1;
int* p;
*p=a;//或者
P=&a;
指针的应用
传递参数(指针的间接访问)
传递参数时,我们分为值传递和指针传递
当我们传递的参数容量很大时,我们尽量使用指针传递
因为使用指针传递大容量的参数时,主函数和子函数使用的是同一套数据,避免了参数传递过程中的数据复制,提高了运行效率,减少了内存占用
我们举一个例子,让他更直观一些:我们假设主函数是一个学霸,我们创建新函数是一个学渣,把主函数内的一个变量假设为作业的话,如果学渣想要抄学霸作业,得到这个变量,但是主函数学霸是不会将变量直接给学渣函数的,他会先把作业抄一遍,把这个复制的作业给学渣,这样就算学渣在这个复制体作业上更改数值,也不会影响到主函数学霸的变量
作业如果是选择题还好说,但如果是作文的话,复制一份既费时又费力,这里我们就可以引用指针传递
比如说我们现在想传递一个数组,数组就属于大容量变量
#include<stdio.h>
int FindMax(int* arr,int Count)
{
int i;
int j=arr[0];
for(i=1;i<Count;i++)
{
if(j<arr[i]);
{
j=arr[i];
}
}
return j;
}
int main()
{
int max;
int arr[5]={10,20,30,40,50};
max = FindMax(arr,5);
printf ("%d",max);
return 0;
}
输出
但是此时我们发现,我们是可以通过改变变量的值来影响主函数中变量的值
这时我们就想到之前学的常量指针,当我们在其他函数中改变变量的值时,编译器就会报错警告我们, 所以使用常量指针是我们指针传递中的一个保护措施
相比较,值传递隔离,数据安全,但是当遇到大容量的数据是会占用较多的空间和时间。指针传递可以处理大容量的数据。为了使数据更安全,我们可以使用常量指针。
指针输出参数
使用指针传递输出参数,利用主函数和子函数使用同一套数据的特性,实现数据的返回,可实现多返回值函数的设计
我们发现第一个应用是避免主函数与子函数使用同一套数据,而第二个应用是反过来的,我们要利用主函数和子函数使用同一套数据,实现多返回值
因为C语言有一个弊端,那就是只能有一个返回值,当我们要返回多个值时,就需要用到指针的这个特征
例题:找到数组中最大的数,和其出现的次数。
#include<stdio.h>
int FindMax(int* max,int* count,int* arr,int lenght)
{
int i;
*max=arr[0];
*count=1;
for(i=1;i<lenght;i++)
{
if(*max<arr[i])
{
*max =arr[i];
*count=1;
}
else if(*max==arr[i])
{
(*count)++;
}
}
}
int main()
{
int MAX,Max;
int Count;
int arr[5]={10,50,30,40,50};
MAX = FindMax(&Max,&Count,arr,5);
printf ("%d\n",Max);
printf ("%d",Count);
return 0;
}
运行:
所以说指针打破了C语言的只能有一个返回值,理论上我们可以用指针写出无数个返回值