首页 > 其他分享 >你真的懂指针吗(1)

你真的懂指针吗(1)

时间:2024-03-12 21:33:27浏览次数:20  
标签:函数 int 指针 地址 swap 真的 变量

在c语言中,我们需要创建变量(也就是向内存申请空间),为了得到变量的地址,我们需要用到&,也就是取地址操作符。我们通过&得到的地址是一个数值,这个数值有时候也需要存储起来,以便后期的使用。这时候就需要一个指针变量将地址值存储起来。

一、解引用操作符  *

我们来看下面这个代码:

int a=10;
int *p=&a;

在上面这个代码中,定义了一个整型变量a,又定义了一个指针变量p指向a。其中,*代表p是指针变量,int代表p指向的是整型变量,在这里也就是a。

同样,如果定义一个字符型变量,该如何书写呢?

char c='w';
char *pa=&c;

二、指针变量的大小

在32位平台下地址是32bit位,指针变量大小是4个字节

在64位平台下地址是64bit位,指针变量大小是8个字节

三、野指针

概念:野指针就是指针指向的内容是不可知的,是随机的

野指针的成因:

1.指针未初始化

int *p;//局部指针未初始化,默认为随机值
*p=20;

2.指针越界访问

int a[10];
int *p=&a[0];
for(int i=0;i<=11;i++)
{
    //当指针指向的范围超过数组范围时,p就是野指针
   *(p++)=i;
}

3.指针指向的空间释放

四、传值调用和传址调用

这里讲解一个初学者经常搞错、无法理解的代码

写一个函数,交换两个变量的值

通过这个代码我们发现,a和b的值没有发生交换。这是为什么呢?

在main函数内部,建立了a和b变量。在调用swap函数时,将a和b传递给swap函数,在swap函数中建立形参x和y来接收a和b的值。但是本质上,x和y是独立的空间,a和x的地址时不一样的,b和y的地址是不一样的。在swap函数内部交换x和y,并没有影响到a和b。回到main函数中,a和b自然没有交换。这种调用函数方式为传值调用。

那我们该怎么办呢?

这时候,我们就可以使用指针,将main函数中a和b的地址传递给swap函数,通过地址间接操作main函数中的a和b,就可以达到交换的目的。

如图所示,a和b的值就交换完成了。这种调用函数方式叫传址调用。

结论:当实参传递给形参时,形参会单独创建一份临时空间来接受实参,对形参的修改并不影响实参。我们需要让函数和主调函数真正的建立联系,在函数内部可以修改主调函数中的变量。

所以,以后如果在函数中只需要主调函数中的变量值来进行计算,就可以采用传值调用。如果函数内部需要修改主调函数中变量的值,就可以使用传址调用。

标签:函数,int,指针,地址,swap,真的,变量
From: https://blog.csdn.net/2302_79779170/article/details/136636490

相关文章

  • 五、指针
    第05章_指针指针是C语言最重要的概念之一,也是最难理解的概念之一。指针是C语言的精髓,要想掌握C语言就需要深入地了解指针。指针类型在考研中用得最多的地方,就是和结构体结合起来构造结点(如链表的结点、二叉树的结点等)。本章专题脉络1、指针的理解与定义1.1变量的访问......
  • Lucene轻量级搜索引擎,真的太强了!!!Solr 和 ES 都是基于它
    一、基础知识1、Lucene是什么Lucene是一个本地全文搜索引擎,Solr和ElasticSearch都是基于Lucene的封装Lucene适合那种轻量级的全文搜索,我就是服务器资源不够,如果上ES的话会很占用服务器资源,所有就选择了Lucene搜索引擎2、倒排索引原理全文搜索的原理是使用......
  • 异步编程真的让程序更快了吗?
    同步和异步调用的本质区别是什么?引言现在异步编程真的是越来越普遍了,从前端的Promise到后端的Channel、Future、Task,异步编程正变得越来越流行。很多同学也玩得很溜了,满世界的异步调用,让程序的效率和用户体验都大大提升。不过,当谈到为什么要使用异步编程,以及它背后的工作原理时......
  • vue3 监听鼠标点击拖动事件,移动端滑动事件,页面指针坐标事件
    PointerEventsAPI是Hmtl5的事件规范之一,它主要目的是用来将鼠标(Mouse)、触摸(touch)和触控笔(pen)三种事件整合为统一的API。Pointer指可以在屏幕上反馈一个指定坐标的输入设备。PointerEvent事件和TouchEventAPI对应的触摸事件类似,它继承扩展了TouchEvent,因此拥有TouchEven......
  • 双指针具有单调性
    双指针的题目往往是看起来需要O(n),我们一般枚举一个指针,然后我们发现另一个指针不走回头路,不论是哪个方向,这样我们的时间复杂度就是O(n).从例题来看:给定一个字符串,我们希望找到最短长度区间能包含所有字母类型。核心:对于左端点固定的时候,我们找到最小的r,然后我们考虑i右移动一......
  • 常量指针与指针常量
    常量指针与指针常量constint*p1;//常量指针,从后往前可以理解为:p1isapointerpointtoconstint常量指针:声明了一个指向整型常量的指针p1,不能通过这个指针p1去修改所指向变量的值。但是可以修改指针p1的指向,即指针p1可以指向别的同类型变量int*constp2;//指针常量......
  • 函数返回数组指针 看不太懂
    有三种方法1.声明一个返回数组指针的函数int(*func(inti))[10];func(inti)表示调用func函数所需要一个int类型的实参。(*func(inti))意味着我们可以对函数调用的结果执行解引操作。//意思就是函数调用的结果的是个指针。(*func(inti))[10]......
  • UE 共享指针 共享引用
    classFTestA{public: FTestA(){ UE_LOG(LogTemp,Warning,TEXT("FTestA构造")); } voidTestFun(){ UE_LOG(LogTemp,Warning,TEXT("FTestATestFun方法")); } ~FTestA(){ UE_LOG(LogTemp,Warning,TEXT("FTestA析构")); }};......
  • 这6个国产办公软件凭什么被推荐?是真的好用
    在数字化时代,办公软件已经成为我们日常生活和工作中不可或缺的工具。近年来,国产办公软件凭借其高效、便捷的特点受到了广泛的好评。今天给大家分享6款备受推荐的国产办公软件,让你了解它们的优势和使用场景。 一、Listary:强大的文件搜索和管理工具 Listary是一款强大的文件搜......
  • c/c++指针中 * 和 & 的区别与联系
    在C语言中,*和&是两个非常基础但功能相反的操作符,它们分别是解引用(dereference)操作符和取地址(address-of)操作符。&(取地址操作符)用途:&操作符用来获取变量的内存地址。示例:假设有一个整型变量intx=10;,则&x表示获取变量x的内存地址。如果你有一个指针变量想要存储变量x的地址,可......