首页 > 其他分享 >C语言指针

C语言指针

时间:2024-07-15 17:09:06浏览次数:19  
标签:初始化 指向 int void C语言 引用 指针

指针

引用与指针

引用 & 指针 *
必须初始化 可以不初始化
不能为空 可以为空
不能更换目标 可以更换目标
初始化案例
int &r;    //不合法,没有初始化引用
int *p;    //合法,但p为野指针,使用需要小心

(1)是否需要初始化
由于引用不能为空,所以我们在使用引用的时候不需要测试其合法性,而在使用指针的时候需要首先判断指针是否为空指针,否则可能会引起程序崩溃。

进行检查
void test_P(int *p){
	if(p !=NULL)
	*p=3;
	return;
}

void test_r(int &r){
	r=3;
	return;
]}

(2)指向目标是否能更改
指针可以随时改变指向,但是引用只能指向初始化时指向的对象,无法改变

指向目标
int a = 1;
int b = 2;

int &r = a;  //初始化引用r指向变量a
int *p = &a; //初始化指针p指向变量a

p = &b;		//指针p指向了变量b
r = b;      //引用r依然指向a,但a的值变成了b

image

引用

左值引用

常规引用,一般表示对象的身份。

右值引用

右值引用就是必须绑定到右值(一个临时对象、将要销毁的对象)的引用,一般表示对象的值。

右值引用可实现转移语义(Move Sementics)和精确传递(Perfect Forwarding),它的主要目的有两个方面:

消除两个对象交互时不必要的对象拷贝,节省运算存储资源,提高效率。
能够更简洁明确地定义泛型函数。
引用折叠
X& &X& &&X&& & 可折叠成 X&
X&& && 可折叠成 X&&
C++的引用在减少了程序员自由度的同时提升了内存操作的安全性和语义的优美性。比如引用强制要求必须初始化,可以让我们在使用引用的时候不用再去判断引用是否为空,让代码更加简洁优美,避免了指针满天飞的情形。除了这种场景之外引用还用于如下两个场景
引用型参数
一般我们使用const reference参数作为只读形参,这种情况下既可以避免参数拷贝还可以获得与传值参数一样的调用方式。

引用型参数
void test(const vector<int> &data)
{
    //...
}
int main()
{
  	vector<int> data{1,2,3,4,5,6,7,8};
    test(data);
}

引用返回值
C++提供了重载运算符的功能,我们在重载某些操作符的时候,使用引用型返回值可以获得跟该操作符原来语法相同的调用方式,保持了操作符语义的一致性。一个例子就是operator []操作符,这个操作符一般需要返回一个引用对象,才能正确的被修改。

引用返回值
vector<int> v(10);
v[5] = 10;    //[]操作符返回引用,然后vector对应元素才能被修改
              //如果[]操作符不返回引用而是指针的话,赋值语句则需要这样写
*v[5] = 10;   //这种书写方式,完全不符合我们对[]调用的认知,容易产生误解

指针

函数指针

函数指针的定义
int (*pf)(int,int);
typedef int (*PF)(int,int);

函数指针使用
/**
 * @file func_pointer.cpp
 * @brief 函数指针的使用!
 */

#include <iostream>
using namespace std;

/**
 * @brief
 * 定义了一个变量pFun,这个变量是个指针,指向返回值为空和参数为int的函数的指针!
 */
void (*pFun)(int);

/**
 * @brief 代表一种新类型,不是变量!所以与上述的pFun不一样!
 */
typedef void (*func)(void);

void myfunc(void) { cout << "asda" << endl; }

void glFun(int a) { cout << a << endl; }
int main() {
  func pfun = myfunc; /*赋值*/
  pfun();             /*调用*/
  pFun = glFun;
  (*pFun)(2);
}

标签:初始化,指向,int,void,C语言,引用,指针
From: https://www.cnblogs.com/WENDAOJG/p/18303511

相关文章

  • C语言的编译和链接
    翻译环境和运⾏环境在ANSIC的任何⼀种实现中,存在两个不同的环境。第1种是翻译环境,在这个环境中源代码被转换为可执⾏的机器指令。第2种是执⾏环境,它⽤于实际执⾏代码。翻译环境那翻译环境是怎么将源代码转换为可执⾏的机器指令的呢?这⾥我们就得展开开讲解⼀下......
  • C语言中关键字static
    前言    在C语言中,static 是一个关键字,它可以用在不同的上下文中,赋予变量或函数不同的意义。static 关键字主要用于控制变量的存储期和可见性,以及函数的链接性。下面是 static 关键字的主要作用原理与用途:局部静态变量    当 static 修饰局部变量时(即......
  • 数组002 一维数组与指针
    #include<iostream>usingnamespacestd;//1、指针的算术://将一个整型变量加1后,其值将增加1。//但是,将指针变量(地址的值)加1后,增加的量等于它指向的数据类型的字节数。////2、数组的地址//2.1数组在内存中占用的空间是连续的。//......
  • 【C语言】 全面解析占位符
    文章目录什么是占位符?常见的占位符及其用法占位符的宽度和精度常见错误和注意事项占位符的高级用法占位符在实际编程中的应用结论在C语言编程中,占位符是一种常用的编程工具,通常用于表示即将填入的某个值。占位符不仅在格式化输出中非常有用,而且在调试和开发过程......
  • 【C语言】全面解析冒泡排序
    文章目录什么是冒泡排序?冒泡排序的基本实现代码解释冒泡排序的优化冒泡排序的性能分析冒泡排序的实际应用结论在C语言编程中,排序算法是一个非常基础且重要的概念。冒泡排序作为最简单、最易理解的排序算法之一,广泛应用于各种编程教学和实践中。本文将全面解析C语......
  • C语言指针超详解——强化篇
    C语言指针系列文章目录入门篇强化篇文章目录C语言指针系列文章目录1.assert断言2.指针的使用和传址调用2.1strlen的模拟实现2.2传值调用和传址调用3.数组名的理解4.使用指针访问数组5.一维数组传参的本质6.冒泡排序7.二级指针8.指针数组9.指针数组模拟......
  • C语言典型例题
    本系列博客针对于《C程序设计教程(第四版)——谭浩强编著》这本书中的所有例题和习题进行了详细的解释和学习,希望可以对你学习C语言可以有所帮助。有些代码可能会在前面详细解释,后面会一笔带过,希望大家可以多多翻阅,谢谢大家啦!!!嘻嘻!!!//C程序设计教程(第四版)——谭浩强编著//例......
  • 【c语言】你绝对没见过的预处理技巧
    ......
  • C语言实现扫雷游戏
    目录一、引言二、游戏规则三、设计思路 1.游戏概述2.数据结构设计3.游戏流程设计4.功能模块划分5.主要算法设计四、游戏设计 1.菜单函数2.主函数3.选择难度函数 4.初始化函数5.布置地雷函数  6.打印函数7.计算雷数函数 8.递归排雷函数9.标记(删除......
  • 指针的运算
    目录开头1.什么是指针的运算?总结指针±\pm±整数指针......