Cpp 指针常见用法(2021-06-13)

本文详细介绍了C++指针的各种用法,包括作为变量、一维数组、二维数组、类成员以及函数指针的使用。通过实例展示了如何利用指针进行变量交换、数组操作、类对象访问以及函数调用。此外,还探讨了多级指针的概念,并提供了实际代码验证。
摘要由CSDN通过智能技术生成

Cpp 指针常见用法

C++的指针的正确理解:指针是一种特殊的变量,该变量存放的是内存地址。
值得一提的是,本博客阐述了多个****************的原理

1、用于变量

变量指针常用在函数的形参中,如经典的swap函数,用于交换两个变量的值。

#include<iostream>
void swap(double* a,double* b)
{
	double temp = *a;
	*a = *b;
	*b = temp;
	
}
int main(int argc, char** argv)
{
	double a, b;
	a = 1, b = 2;
	printf("交换前:a=%f,b=%f\n", a, b);
	swap(&a, &b);
	printf("&a的类型为(%s)\n", typeid(&a).name());
	printf("交换后:a=%f,b=%f\n", a, b);
	std::cin.get();
	return 0;
}

在这里插入图片描述
根据输出结果可以知道,&a实质上为(doubel*)的指针类型,传入swap函数中时摆脱了局部变量的限制。

2、用于一维数组

#include<iostream>
void main(int argc, char** argv)
{
	double a[3] = {1.3,2.6,3.13};
	printf("a的类型为:%s\n", typeid(a).name());
	double* pa = a;
	for (int i = 0; i < 3; i++) { printf("a[%d]=%f\n",i,*(pa+i)); }
	printf("pa的类型为:%s\n", typeid(pa).name());
	std::cin.get();
	return;
}

在这里插入图片描述

3、用于二维数组

#include<iostream>
void main(int argc, char** argv)
{
	double a[2][2] = { {11.00,12.00},{21.00,22.00} };
	for (int i = 0; i < 2; i++)
	{
		for (int j = 0; j < 2; j++)
		{
			printf("a[%d][%d]=%f\t", i, j, *(*(a + i) + j));
		}
		printf("\n");
	}
	double *pa = *a;
	printf("pa的类型为:%s\n", typeid(pa).name());
	printf("**a的类型为:%s\n", typeid(**a).name());
	printf("*a的类型为:%s\n", typeid(*a).name());
	printf("a的类型为:%s\n", typeid(a).name());
	printf("pa[0]=%f,pa[1]=%f\n", pa[0], pa[1]);
	printf("**a=%f,\t*(*a+1)=%f\n", **a, *(*a + 1));
	std::cin.get();
}

在这里插入图片描述

4、用于类

main.cpp
#include<iostream>
#include<cmath>
#include"MyClass.h"
int main(int argc, char**argv)
{
	MyClass *pmc;
	pmc = new MyClass(2);
	std::cout << sqrt(pmc->r2(3,4))<<std::endl;
	delete pmc; //验证析构函数是否被调用
	std::cin.get();
	return 0;
}
MyClass.h
#pragma once
#include<iostream>
class MyClass
{
public:
	MyClass();
	MyClass(double a);
	double r2(double x, double y);
	~MyClass();
	double ca;
private:
};
MyClass.cpp
#include"MyClass.h"
MyClass::MyClass()
{
}

MyClass::MyClass(double a)
{
	ca = a;
}
double MyClass::r2(double x, double y)
{
	return x*x + y*y;
}
MyClass::~MyClass()
{
	printf("析构函数被调用了");
}

在这里插入图片描述

5、函数指针类型

  • 范例1
// 函数作为另外一个函数的参数
#include<iostream>
double fun(double x, double y)
{
	return x + y;
}
//******************************************
double fun1(double x, double y,double (*f)(double,double))
{
	return (*f)(x, y);
}
//******************************************
void main(int argc, char** argv)
{
	double (*pf)(double x, double y)=fun;
	printf("fun的类型为%s\n", typeid(fun).name());
	printf("*pf的类型为%s\n", typeid(*pf).name());
	printf("pf的类型为%s\n", typeid(pf).name());
	printf("(*pf)(1, 1)=%f\n", (*pf)(1, 1));
	printf("fun1(1,1,fun)=%f", fun1(1, 1, fun));
	std::cin.get();
	return;
}

在这里插入图片描述

  • 范例2
// 函数作为另外一个函数的参数
#include<iostream>
class MyClass
{
public:
	static void printhhh() { std::cout << "哈哈哈\n"; };
	static void p1(void f()) { f(); };
private:
};
//******************************************
void main(int argc, char** argv)
{
	MyClass::p1(&MyClass::printhhh);
	printf("%s", typeid(&MyClass::printhhh).name());
	std::cin.get();
	return;
}

在这里插入图片描述

6、多级指针

拿经典的**举例:

double ** ppa;
ppa的类型为 double**,它可以指向指针的指针。
如double b=1;
double* pb=&b;
ppa=&pb;
这样就实现了ppa指向pb,**ppa存放的是b的值。

假设存在一个二维数组a[6][2],那么二维数组各个元素的地址如图所示:
在这里插入图片描述
下列代码可以验证上面的推理:

#include<iostream>
using namespace std;
int main()
{
	double a[6][2] = { };
	for (int i = 0; i < 6; i++)
	{
		for (int j = 0; j < 2; j++)
		{
			printf("&(a[%d][%d])=%p\t", i, j, &a[i][j]);
		}
		printf("\n");
	}
	printf("****************************************\n");
	for (int i = 0; i < 6; i++)
	{
		for (int j = 0; j < 2; j++)
		{
			printf("*(a + %d) + %d=%p\t", i, j, *(a + i) + j);
		}
		printf("\n");
	}
	std::cin.get();
	return 0;
}

验证结果如下,与推理完全吻合:
在这里插入图片描述
最后来一段应用多级指针应用的代码:
在这里插入图片描述

#include<iostream>
int main(int argc, char** argv)
{
	double a = 666.666;
	double* pa = &a;
	double** ppa = &pa;
	double*** pppa = &ppa;
	printf("ppa类型为%s,pppa类型为%s\n", typeid(ppa).name(),typeid(pppa).name());
	printf("**ppa=%f\n***pppa=%f\n", **ppa, ***pppa);
	std::cin.get();
	return 0;
}

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: cppcheck-2.10-x64-setup.msi是Cppcheck静态代码分析工具的安装程序。Cppcheck是一个开源的跨平台C / C ++代码静态分析工具,用于检测代码中的错误和潜在问题。这个工具可以帮助开发人员在编码过程中找出可能导致程序错误或不良行为的问题,提高代码的质量和可靠性。 cppcheck-2.10-x64-setup.msi是为Windows 64位操作系统提供的版本。该安装程序将cppcheck工具及其依赖项自动安装到计算机上。安装过程简单,只需要按照向导提示完成安装步骤即可。 安装完成后,用户可以通过命令行或者集成开发环境(IDE)来使用Cppcheck进行代码分析。Cppcheck提供了大量的检查选项,可以根据具体需求进行配置。它可以检查代码中的常见错误,如内存泄漏、空指针解引用、未初始化的变量等。此外,Cppcheck还可以进行代码风格检查、性能分析和安全性检查等。 使用Cppcheck进行代码分析可以帮助开发人员及时发现并修复潜在问题,提高代码的可靠性和可维护性。它是一个非常有用的工具,特别适用于大型和复杂项目的开发过程中。 总之,cppcheck-2.10-x64-setup.msi是Cppcheck静态代码分析工具的安装程序,它可以帮助开发人员找出代码中的错误和潜在问题,提高代码的质量和可靠性。 ### 回答2: cppcheck-2.10-x64-setup.msi是一个用于安装Cppcheck静态代码分析工具的安装程序。Cppcheck是一个开源的C/C++代码检查工具,用于静态代码分析和检查源代码中的错误、潜在问题和代码质量问题。 Cppcheck使用AST(抽象语法树)来解析源代码,并应用各种规则来检查代码中的常见错误和问题,如内存泄漏、无效的指针、未使用的变量、空指针解引用等。它还可以检查代码的风格和可维护性,帮助开发人员遵循良好的编程实践。 通过安装cppcheck-2.10-x64-setup.msi,用户可以轻松地将Cppcheck集成到他们的开发环境中,并在开发过程中运行Cppcheck来检查他们的代码。该安装程序为64位操作系统提供支持,并提供了一个简单的安装向导,使安装过程变得简单快捷。 安装完成后,用户可以通过命令行或IDE插件使用Cppcheck。用户可以指定要分析的代码文件或者整个项目文件夹,并运行Cppcheck进行代码分析。Cppcheck会生成一个详细的报告,其中包含代码中发现的问题的列表和建议的修复方法。 通过使用cppcheck-2.10-x64-setup.msi安装Cppcheck,开发人员可以提高代码质量和可维护性,减少潜在的错误和问题,并帮助他们编写更高质量的C/C++代码。 ### 回答3: cppcheck-2.10-x64-setup.msi 是一个软件安装文件,用于安装Cppcheck 2.10版本的C / C ++代码静态分析工具。Cppcheck是C / C ++代码的静态分析器,可以帮助开发人员检测代码中的潜在错误和缺陷。 该安装文件是采用MSI(Microsoft Windows Installer)技术创建的,这是一种用于在Windows操作系统上安装软件的标准安装包格式。通过双击该.msi文件,用户可以方便地启动软件安装程序。 安装Cppcheck可以提供许多优点。首先,Cppcheck可以扫描源代码,并识别出潜在的编程错误,如内存泄漏、空指针解引用、不兼容的类型转换等。这有助于发现和纠正在程序运行时可能导致崩溃或漏洞的错误。 此外,Cppcheck还可以提供代码质量评估,包括代码风格和标准规范的检查。它可以帮助开发人员遵循良好的编码规范,提高代码的可读性、可维护性和可扩展性。 最后,Cppcheck还提供了一个易于使用的图形界面,使用户能够方便地导入和分析代码,并查看检测到的错误和建议的修复。这使得开发人员可以更快速地调试和优化他们的代码。 总而言之,cppcheck-2.10-x64-setup.msi 是Cppcheck 2.10版本的软件安装文件。通过安装Cppcheck,开发人员可以使用这个强大的工具来检测和改进他们的C / C ++代码,提高代码的质量和可靠性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值