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

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.xdnf.cn/news/11863.html

相关文章:

  • 图神经网络实战——图属性度量方法详解
  • @Prometheus 监控-MySQL (Mysqld Exporter)
  • 【从GEO数据库批量下载数据】
  • docker生命周期
  • 结构性设计模式之Flyweight(享元)
  • Linux基本指令(三)
  • 【投稿优惠】2025年人工智能与图像处理国际会议(AIIP 2025)
  • 物联网协议之MQTT(一)基础概念和设备
  • 【Web应用】若依框架:基础篇14 源码阅读-后端代码分析
  • 瀚文(HelloWord)智能键盘项目深度剖析:从0到1的全流程解读
  • [特殊字符] Spring Boot底层原理深度解析与高级面试题精析
  • webpack继续学习
  • 一个小小的 flask app, 几个小工具,拼凑一下
  • epoll
  • HikariCP 可观测性最佳实践
  • 你工作中涉及的安全方面的测试有哪些怎么回答
  • STM32上部署AI的两个实用软件——Nanoedge AI Studio和STM32Cube AI
  • ESOP交易系统搭建全景指南:从合规基石到价值跃迁
  • 人机融合智能 | 可穿戴计算设备的多模态交互
  • Vue中的自定义事件
  • PLC远程控制网关支持多塘口水环境数据边缘计算与远程安全传输的配置指南
  • 四款主流物联网操作系统(FreeRTOS、LiteOS、RT-Thread、AliOS)的综合对比分析
  • Mac/iOS 如何解压 RAR 格式压缩包:常用工具与详细操作步骤
  • GNSS误差源 介绍
  • 【C/C++】入门grpc的idl
  • 格恩朗超声波水表 精准计量 智慧之选
  • matlab模糊控制实现路径规划
  • 详细讲解Flutter GetX的使用
  • 职坐标IT教育物联网全栈开发实战:传感器到云平台全链路
  • 鸿蒙应用开发之uni-app x实践