当前位置: 首页 > news >正文

C语言-指针基础概念

C语言-指针

指针

指针的基本概念

指针的定义

指针:就是保存地址的变量

指针变量的定义:

类型名 *指针变量名
int i;
int *p = &i; //将变量i的地址存放在*p中,即p指向i
int* p,q;等价于 int *p,q; //其中p是一个指向int类型的指针,而q是一个int类型的变量,所以*是加给了p而不是int,也就是说*p是int
int *p,*q; //表示p和q都是指针
char *pa; //定义一个指向字符型的指针变量
int *pb; //定义一个指向整型的指针变量

注意:

  • 指针变量的值是内存的地址
    • 普通变量的值是实际的值
    • 指针变量的值是具有实际值的变量的地址
指针作为参数
void f(int *p); //在被调用的时候得到了某个变量的地址
int i = 0;f(&i); //在函数里面可以通过指针当问外面的i

举例:

  • 指针存放地址
#include <stdio.h>
void f(int *p);int main(void)
{int i = 6;printf("&i = %p\n",&i); //打印i的地址f(&i); //将i的地址传递给指针preturn 0;
}void f(int *p)
{printf("p=%p\n",p);
}

结果如下:

在这里插入图片描述
26110200695.png&pos_id=img-G3sWvg4l-1749041525469)

上述结果表明,指针p里存放的是i的地址,而非变量数值

  • 通过指针访问变量值
#include <stdio.h>
void f(int *p);int main(void)
{int i = 6;printf("&i = %p\n",&i); //打印i的地址f(&i); //将i的地址传递给指针preturn 0;
}void f(int *p)
{printf("p = %p\n",p);printf("*p = %d\n",*p);
}

结果如下:

在这里插入图片描述

上述结果表明,p变量存放的是变量i的地址,而*p存放的是变量i的值

  • 通过指针修改变量值
#include <stdio.h>
void f(int *p);
void g(int k);
int main(void)
{int i = 6;printf("&i = %p\n",&i); //打印i的地址f(&i); //将i的地址传递给指针pg(i);return 0;
}void f(int *p)
{printf("p = %p\n",p);printf("*p = %d\n",*p);*p = 26;
}
void g(int k)
{printf("k = %d\n",k);
}

结果如下:

在这里插入图片描述

上述结果表明,当*p改变时,i的值也随之变化

  • 总结
    • 指针变量p用于访问地址
    • 变量*p用于访问和修改指针p指向地址所对应的数值
    • *p进行值的改变时,指针p指向的地址所对应的值也会随之改变(相当于覆盖)
关于scanf函数
int i;
scanf("%d",i); //语法错误
scanf("%d",&i); //正确写法

当出现上述错误写法时,编译器不会报错,因为i时整型的数值,和地址写法一样,例如:i = 6,将i直接传给scanf()时,scanf()函数会直接将i的数值6当作地址来处理,因此不会出现编译错误,但是运行一定会出错,因为scanf()函数将传入的数据写到了错误的地址上。要注意的是,在编写过程中,我们需要传入的是i的地址,即&i。

指针的应用场景

交换两个变量的值
#include <stdio.h>void swap(int *pa,int *pb);int main()
{int a = 5;int b = 6;swap(&a,&b);printf("a = %d,b = %d",a,b);return 0;
}
void swap(int *pa,int *pb) //用于交换变量值的函数
{//进行数值交换int t = *pa;*pa = *pb;*pb = t;
}

结果如下:

在这里插入图片描述

带回多个结果
  • 函数返回多个值,某些值就只能通过指针返回
  • 传入的参数实际上是需要保存带回的结果的变量
#include <stdio.h>void minmax(int a[],int len,int *max,int *min);int main(void)
{int a[] = {1,2,3,4,5,6,7,8,9,12,13,14,16,17,21,23,55};int min,max;minmax(a,sizeof(a)/sizeof(a[0]),&min,&max);printf("min = %d,max = %d\n",min,max);return 0;
}
void minmax(int a[],int len,int *max,int *min)
{int i;*min = *max = a[0];for(i = 1;i < len;i++){if(a[i] < *min){*min = a[i];}if(a[i] > *max){*max = a{i};}}
}

结果如下:

在这里插入图片描述

  • 函数的结果不止一个,需要通过指针把要接收的结果的变量地址传进去,经过函数加工后把值传回。
  • 虽然*min*max是作为参数传入的,但是其作用是将函数程序加工后的结果带回
通过指针返回运算状态
  • 函数返回运算的状态,结果通过指针返回

  • 常用的套路是让函数返回特殊的不属于有效范围内的值来表示出错

    -1或0(在文件操作系统中会看到大量的例子)

  • 当任何数值都是有效的可能结果时,就需要分开返回

http://www.lqws.cn/news/141679.html

相关文章:

  • Vue 生命周期全解析:从创建到销毁的完整旅程
  • OD 算法题 B卷【查找舆情热词】
  • el-amap-bezier-curve运用及线弧度设置
  • 构建高效可靠的电商 API:设计原则与实践指南
  • Oracle数据库笔记
  • 智能合约安全漏洞解析:从 Reentrancy 到 Integer Overflow
  • 嵌入式系统中常用的开源协议
  • LeetCode 热题 100 739. 每日温度
  • 修复与升级suse linux
  • Viggle:开启视频人物替换新纪元
  • 滑动智能降级:Glide优化加载性能的黑科技
  • 用布局管理器grid实现计算机界面
  • Win11系统输入时首字母丢失 - 解决方案
  • 11. 试学内容-如何理解隔离性2(原理)
  • 题海拾贝:P2347 [NOIP 1996 提高组] 砝码称重
  • 【计网】SW、GBN、SR、TCP
  • 【无人机】无人机UAV、穿越机FPV的概念介绍,机型与工具,证书与规定
  • 【算法题】最长回文子串
  • RAG-Gym:一个用于优化带过程监督的代理型RAG的统一框架
  • C++语法系列之IO流
  • 重温经典算法——希尔排序
  • C语言数组初始化方法大全(附带实例)
  • 高速PCB设计中圆弧布线是否必要
  • ApacheSuperset CVE-2023-27524
  • L1-019 谁先倒 (15 分)
  • 慢SQL调优(二):大表查询
  • 《Offer来了:Java面试核心知识点精讲》大纲
  • 10. MySQL索引
  • Android apk装机编译类型: verify、speed-profile, speed与启动耗时
  • BUU MISC(持续更新)