指针小结

1.指针与左值、右值

在C++中有左值与右值之分,弄清楚它们的关系和区别很重要。当一个对象用作左值时用的是对象的身份(即其内存),当一个对象用作右值时用的是对象的值(即内容)。

例如:

int a = 5,b = 6;

a=b;   //a是左值,用的是a在内存中的位置

//b是右值,用的是b的值,即6

取地址符作用于一个对象时取这个对象的地址,返回一个指向此对象的指针。所以取地址符作用一个左值对象,返回值是指针,而指针是一个右值。解引用运算符求值结果是左值。

例如:

int *p;

p的类型为int*,因为解引用运算符生成左值,所以decltype(*p)的结果是int&;因为取地址符生成右值,所以decltype(&p)的结果是int**,所以结果为一个二级指针。

2.指针函数与函数指针

指针函数是函数,就是一个返回指针的函数;函数指针是指针,就是指向函数的指针。两者在形式上很相像,初学者很容易混淆。

例如:int* function();  //指针函数,返回类型为int型指针

int (*pointer)();//函数指针,指向返回类型为int,无形参的函数

函数指针一定不能漏掉括号,漏掉后就成了指针函数了。因为函数调用运算符(即())优先级比解引用运算符(即*)高,所以表达式int* function()中function先与()结合,说明function是一个函数,返回类型为int*;而在第二个表达式int (*pointer)()中,*pointer倍括号括起来了,所以pointer是一个指针,指向一个函数,此函数返回值为int。

由于在程序中多次声明函数指针比较麻烦,所以函数指针多用类型别名。

例如:typedef int (*pointer)();  这条语句声明了一个指向返回类型为int且无形参的指针类型,类型名为pointer。int (*pointer)()中的pointer本来是一个指针变量,但加上typedef后就成了类型名,可以用pointer声明变量。例如:pointer ptr; ptr是一个指向返回值为int型且无形参的函数指针。

未完待续...

时间: 2024-08-09 22:02:46

指针小结的相关文章

黑马程序员学习笔记-C指针小结

黑马程序员学习笔记-C指针 1. 指针简介: 指针是C语言中非常重要的数据类型,是C语言的精华 2. 指针变量定义: 格式:类名标识符 *指针变量名; 指针变量只能存储地址 指针就一个作用:能够根据一个地址值,访问对应的存储空间 指针变量p前面的int:指针变量只能指向int类型的数据 3.实例: 4. 注意点: 指针变量只能存储地址.指针变量未经初始化,不要拿来间接访问其他存储空间.指针变量的初始化可以int *p = &a;也可以拆分成两句:int *p; p =&a;.定义变量时的*

C指针小结2

在上一篇对指针的小结中只是片面的说明了指针的概况,与基本含义,其实说到指针必然要提及数组,数组与指针有着密不可分的联系.但是切记数组和指针根本是两个东西,指针不能和数组画等号. 数组: 例如 int a[10];这声明的是一个由10个整形组成的数组,其中包含10个整形元素,同时数组名的值是一个指针常量,也就是数组第一个元素的地址.如果前面声明的是其他类型那么,数组名的类型就是"指向其他类型的常量指针".之前说过数组与指针不是一个东西,那么他们的区别在哪里? 1.数组具有确定数量的元素,

C指针小结

在C语言的学习中,指针,数组,函数等被我们所熟知,但是真正碰到或者真正用到时,难免有些混淆.下面重点聊一下指针: 指针:通俗讲是内存单元的地址,是个常量.换句话说是地址. 指针变量:在C语言中允许一个变量来存放指针,这个变量就是指针变量.是个变量.换句话说是取值为地址的变量.(但是在平时大家统称指针变量为指针,这个要分清) 指针变量的类型说明: 类型说明符* 变量名:初始化的两种方法:int* p = &a或者int* p;p = &a;( 指针定义时要初始化,这是一个好习惯) 指针变量的

C指针小结1

我认为C语言的核心就是指针和对内存的操作,而操作内存就是由指针实现的,所以说指针真的非常非常重要,在后边的数据结构的学习中更要用指针,如果你立志要走C系统的开发这条路,那么你就应当精通指针的各种应用.下面写一点博主在学习指针时的一点小心得,小体会(仅仅一家之言). 在刚学习指针时是真的一头雾水,感觉好难理解啊,这到底是个什么鬼?为何如此之难?不过在经过很长时间的纠结后博主还是有所体会. 指针: 指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存

C++的RAII和智能指针小结

RAII:资源分配即初始化,利用构造函数和析构函数定义一个类来完成对资源的分配和释放 智能指针主要用来防止内存泄漏,我们来举个栗子,看看为什么会有智能指针这个东东 例1: 对于上面这段程序,由于抛出异常的时候影响了代码的执行流,所以要在异常捕获之前将p提前释放(详见 我的博客:C++的异常浅析),虽然可以通过再次抛出以异常解决这个问题,但是在代码美观方面不够完 美,更重要的是如果在代码量非常大,而且在多处有动态开辟出来的空间的时候,仅仅通过再次抛出异常已 经远远不够解决这个问题了,会使得工作量大

学习点滴记录之三指针小结

1.简单来的说,指针也是一种变量,占有内存空间,并且指向内存地址. 2.声明时,*表示声明的变量为指针:操作时,*表示对指针指向内存空间的值进行操作. *p相当于通过地址(p变量的值)找到内存,并对该内存进行操作. *p放在“=”左边,表示对内存进行赋值运算:放在右边,则是读取该内存中的值. 3.指针变量和它指向的内存块是两个不同的概念 //含义1 给p赋值p=0x1111; 只会改变指针变量值,不会改变所指的内容:p = p +1; //p++ //含义2 给*p赋值*p='a'; 不会改变指

C指针小结3

现在总结指针的更高一级的用法,其中指向函数的指针在我的博文中已经单独介绍过了,将会补充介绍几点,现在介绍别的指针的用法. 首先介绍几个陷阱: int f()[]; int f[](); 这两个声明都是非法的,如果有人问这两个声明什么意思,我们应当不加思索的说出这是错误地声明,博主就曾经苦苦思考过这两个声明的意思,现在想想都觉得可笑. 现在对于指向函数的指针补充几点: 例如: int (*pf)(int)=&f; 现在创建了一个函数指针,并把它初始化为指向函数f,其实初始化表达式的&操作符是

C和指针小结

C和指针 相关基础知识:内存的分配(谭浩强版) 1.整型变量的地址与浮点型/字符型变量的地址区别?(整型变量/浮点型变量的区别是什么) 2.int *p,指向整型数据的指针变量. 3.通过指针变量访问整型变量. 4.*p :指针变量p指向的存储单元(变量) 5.p = &a——>> *p = *&a 6.用指针作函数参数 7.调用函数中,由于虚实结合是采用单向的“值传递”方式,只能从实参向形参传数据,形参值的改变无法回传给实参. 8.引用一个数组元素可以用(1)下标法(2)指针

指针和数组(上)

1)指针基础: 既然程序中的变量只是一段存储空间的别名,那么是不是必须通过这个别名才能使用这段存储空间, int main() { int i=5; int *p=&i; printf("%d,%08x\n",i,p); *p=10; printf("%d,%08x\n",i,p); return 0; } 指针本质: 指针在本质上也是一变量, 指针需要要占用一定的内存空间, 指针用于保存内存地址的值, *号的意义: 在指针声明时,*号表示所声明的变量为指针