当前位置: 首页 > 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(在文件操作系统中会看到大量的例子)

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

相关文章:

  • leetcode题解236:二叉树的最近公共祖先
  • Elasticsearch中什么是分析器(Analyzer)?它由哪些组件组成?
  • JS利用原型链实现继承
  • 【leetcode】9. 回文数
  • (每日一道算法题)求根节点到叶节点数字之和
  • Java-IO流之字符输出流详解
  • qiankun模式下 主应用严格模式,子应用el-popover 点击无效不显示
  • GAN训练困境与模型分类:损失值异常与生成判别模型差异解析
  • 第八部分:第六节 - 状态管理 (基础):协调多个界面的状态
  • 基于 ShardingSphere + Seata 的最终一致性事务完整示例实现
  • 局部变量-线程安全
  • 深度学习项目之RT-DETR训练自己数据集
  • 【docker】容器技术如何改变软件开发与部署格局
  • CMake在VS中使用远程调试
  • PocketFlow 快速入门指南
  • 【仿生】硬件缺失,与组装调试,皮肤问题
  • 【C/C++】入门grpc的idl
  • 【算法训练营Day06】哈希表part2
  • 研究探析 | 高速摄像机在一种新型冲击压痕技术及其动态标定方法中的应用
  • 「Java教案」顺序结构
  • 哪里做网站排名/大连网站搜索排名
  • 深圳外贸网站制作价格/seo3的空间构型
  • wordpress forum/seo站长综合查询
  • 小学生网站制作/seo教程网
  • 政府网站平台建设标准/seo综合查询中的具体内容有哪些
  • 澳门赌网站有做代理/郑州seo网站关键词优化