指针易混点

C++最强大的地方之一在于指针。

关于指针,首先我来说一下,它的好处。

好处一,用指针传递数据,节省空间和时间

好处二,可以动态的创建数组,也就是说在程序编译的时候创建内存空间。

比如说:

int length;
cin>>length;
int * A = new int[length];

以上代码是正确的,而且也很节省空间,用多少就开多少空间。与之相对立的是静态编译,在程序执行之前就已经将空间定下来,如果把最后一行改成int A[length]是通不过,因为程序执行之前需要确定数组的大小。

然后,我想讲讲书上看到的一个例子,交换两个数

#include <iostream>
using namespace std;

void swap1(int p,int q)
{
	int temp;
	temp = p;
	p = q;
	q = temp;
}

void swap2(int *p,int *q)
{
	int *temp;
	*temp = *p;
	*p = *q;
	*q = *temp;
}

void swap3(int *p,int *q)
{
	int *temp;
	temp = p;
	p = q;
	q = temp;
}

void swap4(int *p,int *q)
{
	int temp;
	temp = *p;
	*p = *q;
	*q = temp;
}
void swap5(int &p,int &q)
{
	int temp;
	temp = p;
	p = q;
	q = temp;
}

int main(){
	int a = 1,b= 2;
	swap1(a,b);
	swap2(&a,&b);
	swap3(&a,&b);
	swap4(&a,&b);
	swap5(a,b);
	cout<<a<<” “<<b<<endl;
	return 0;
}

首先说一下,正确的交换函数是swap4,swap5

理由如下:

swap1传的是 值的副本,在函数体内修改了行参,但是它们是局部变量,不会影响主函数的a和b

swap2的问题是不符合逻辑,int * temp并未分配内存,系统会随机给它一个临时变量,会造成内存泄漏

swap3 只是指针的变化,而地址的值却没有变化,举个例子就是要交换两个仓库里的物品,函数的功能只是将它们仓库门上的钥匙换了换,有什么用

swap4可以实现两数的交换,因为它修改的是指针所指向地址中的值

swap5是一个引用传递,修改的结果直接影响实参

之后,我想说几个比较容易混的概念,的确比较难理清。

函数指针:  void (*f) ()

指针函数: void* f()    这也就是函数返回指针

const指针: const  int *

指向const的指针:  int * const

指向const的const指针: const   int * const

再来两个:

数组指针:指向整形数组的指针

int (*ptr)[]

指针数组:数组里存放的是指针

int *ptr[]

最后再来一大波:

Long (*fun) (int)

这是一个函数指针,指向函数的指针,返回值是long,参数是int

float (**def)[10]

def是一个二级指针,它指向的是一个一维数组的指针,数组的元素都是float

double *(*gh)[10]

gh是一个指针,它指向一个一维数组,数组元素都是double*

double (*f[10])()

f是一个数组,f有10个元素,元素都是函数的指针,指向的函数类型是没有参数且返回double的函数

时间: 2024-11-08 09:41:51

指针易混点的相关文章

易混点二

在层次化网络设计方案中,通常在(汇聚层)实现网络的访问策略控制. 层次化网络,核心,汇聚,接入: 核心层,骨干组件,高速交换组件,数据交换的任务: 汇聚层,核心层与终端用户接入层的分界面,网络访问策略,数据包处理,过滤,寻址,其他数据处理的任务: 接入层,本地网段用户接入: 易混点二

【转】 C++易混知识点2. 函数指针和指针函数的区别

我们时常在C++开发中用到指针,指针的好处是开销很小,可以很方便的用来实现想要的功能,当然,这里也要涉及到指针的一些基本概念.指针不是基本数据类型,我们可以理解他为一种特殊类型的对象,他占据一定空间,但是所带来的好处就是C++如此强大的深层次原因了. 转载请注明出处: http://blog.csdn.net/elfprincexu 1. 指针函数, ( __type__ * func( void, int,) ) 顾名思义,他是一个函数,只不过和一般函数区分的原因是它返回的是一个指针.int*

【转】 C++易混知识点4: 自己编写一个智能指针(Reference Counting)学习auto_ptr和reference counting

这篇文章建大的介绍了如何编写一个智能指针. 介绍: 什么是智能指针?答案想必大家都知道,智能指针的目的就是更好的管理好内存和动态分配的资源,智能指针是一个智能的指针,顾名思义,他可以帮助我们管理内存.不必担心内存泄露的问题.实际上,智能指针是一个行为类似于指针的类,通过这个类我们来管理动态内存的分配和销毁.方便客户端的使用.相比于一般指针,智能指针主要体现在它使用的容易和便捷性. 转载请注明出处: http://blog.csdn.net/elfprincexu 使用一般指针的问题: 一般情况下

C提高_day03_一级指针易犯错误模型

1.char *(字符串)做函数参数出错模型分析 建立一个思想:是主调函数分配内存,还是被调用函数分配内存: //不要相信,主调函数给你传的内存空间,你可以写......一级指针你懂了. 但是二级指针,你就不一定懂...抛出......... void copy_str21(char *from, char *to) { if (*NULL = '\0' || *to!='\0') { Printf("func copy_str21() err\n"); return; } for (

总结了一些指针易出错的常见问题(六)

安全问题与指针误用 声明和初始化指针(初始化失败) 误用指针 释放问题 指针声明: // 宏定义(仅仅是替换) #define PINT int*; PINT ptr1, ptr2;其实是定义 int* ptr1, ptr2;一个指针,一个整型常量. //typedef 命名已有数据类型(优于宏定义) typedef int* PINT; PINT ptr1, ptr2; 宏定义和typedef区别参考:浅谈c/c++typedef和#define区别 //  宏定义  和  typedef区别

总结了一些指针易出错的常见问题(三)

指针与字符串 NULL和NUL区别:前者用来表示特殊的指针((void*)0),而NUL是一个char(\0),不可混用. 字符常量:单引号:字符串:双引号: 字符串的声明方式:字面量.字符数组.指针. 字符串字面量池: 字符串初始化 初始化char数组:   char header[]="Media Player"; strcpy函数初始化数组 char header[13]; strcpy(header, "Meadia Player"); 2.初始化char指

总结了一些指针易出错的常见问题(四)

指针与结构体 简介:我们可以使用C的结构体来表示数据结构元素,比如链表或树的节点,指针是把这些元素联系到一起的纽带. typedef struct _person{ char* firstName; char* lastName; char* title; unsigned int age; } Person;/*用点表示法初始化*/ Person person;person.firstName=(char*)malloc(strlen("Emily")+1);stcpy(person

Java易混小知识——equals方法和==的区别

一.equals方法和==的区别 1.equals是String对象的方法,可以通过".“调用. 2.== 是一个运算符. 二.常用的比较用法 1.基本数据类型比较. equals和==都比较两个数值 是否相等.相等即为true,不相等则为false. 2.引用对象的比较. equals和==都比较栈内存中的地址是否相等.相等即为true,不相等则为false. 三.易错点 1.String是一个特殊的引用类型.对于两个字符串的比较,不管是==还是equals这两者比较的都是字符串是否相同. 2

总结了一些指针易出错的常见问题(七)

指针的其他重要内容 主要研究以下问题 指针的类型转换 访问硬件设备 别名和强别名 使用restrict关键字 线程(一是如何用指针在线程之间共享数据这个基本问题:二是如何用指针支持回调函数(一个操作可能会调用某函数来执行任务,如果实际被调用的函数发生了改变,我们称之为回调函数.)) 面向对象技术 转换指针 类型转换是一种基本操作,跟指针结合使用时很有用. 访问有特殊目的的地址: 分配一个地址来表示端口: 判断机器的字节数: 整数转换为整数指针: int num =8; int *pi = (in