指针(2)指针基本了解及其应用

发布时间 2023-12-05 22:49:41作者: 瑜阳

<1>指针

(1)指针基本概念

1)引入:提出问题:

  • 如果能够将取得的变量的地址传递给一个函数,能否通过这个地址在那个函数内访问这个变量

2)回顾scanf函数功能

  • 格式:scanf("%d",&i)
  • 深入探讨:scanf()的原型应该是怎样的?我们需要一个参数能保存别的变量的地址,如何表达能够保存地址的变量?

3)提出指针

  • 指针定义:保存地址的变量
举例:

int i;
intp=&i;
1.//p表示指针;
表示p是一个指针,它指向int;现在我们将i的地址交给p
通俗来讲:我们有一个变量i和一个变量p,p是指针,p获得的值是i的地址,也就是p指向i
2.//细节:同时我们应明确p是一个整体,p是一个int,于是p是一个指针

(2)指针变量

1)概念明晰

  • 变量的值是内存的地址
  • 普通变量存放的是实际的值
  • 指针变量的值是具有实际值的变量的地址

//也就是说指针变量里存储的是地址,指向其他实际的变量;而普通的变量中存放的就是实际的值

2)作为参数的指针

1.相关概念及意义

  • 示例:void f(int*p);
  • 实际意义:在被调用时得到了某个变量的地址;

重点:当我们在调用f函数时,我们就要交给它一个地址而不能是变量本身——示例:int i=0;f(&i);

同时我们以一段代码为例:

#include<stdio.h>

void f(int p);//对函数进行原型声明
int main(){
int i=6;
printf("&i=%p\n",&i);//将i的地址取出来交给f函数
f(&i);
return 0;
}
void f(int
p)
{
printf("p=%p\n",p);
}

从整体进行理解:在main函数中有一个变量i,值为6,地址为70;我们把这个地址取出来交给另外一个f函数中的变量p,p的值是70;于是我们可以说p是一个指针指向i

3)访问地址上的变量*

  • 1.相关概念:

*是一个单目运算符,用来访问指针的值所表示的地址上的变量;

<2>指针的使用

1>相关应用情景

(1)应用场景1——交换两个变量的值

  • 代码示例:

void swap (int *pa , int pb){
int t=
pa;
pa=pb;
*pb=t;
}// 1.定义swap函数;
2.//在主函数中对函数进行调用swap(&a,&b);
3.//输出a,b交换之后的值;

(2)应用场景2——函数返回多个值

  • 传入的参数实际上是需要保存带回的结果的变量;

  • 函数返回多个值,就需要使用指针

1)我们以一段代码为例(针对函数返回多个值的情况):

示例:输出最大值和最小值

(3)应用场景3——

  • 函数返回运算的状态,结果通过指针返回;

  • 通常情况下会让函数返回特殊的但不属于有效范围的值表示出错:常见示例-1或0;

  • 但是也会存在特殊情况:即返回的任何数值都是有效的可能结果,就会采用分开返回的方法;

2>易错点

  • (1)定义的指针变量没有指向任何变量便直接使用指针

1.我们以一段代码为例:

int i=6;
int *p;
int k;
k=12;
*p=12;

2.出错原因

在这段代码中,我们并未对p进行初始化(本地变量不会默认初始化),p未与任何变量联系在一起被赋予一个有效的值,所以在此处对p进行赋值的操作是错误的,它可能会指向不定的位置;

3.总结

任何一个地址变量在没有赋值之前(没有得到任何实际的变量之前),都不能通过*p来访问任何数据