不要伤害指针(1)--运算符&和*】的更多相关文章

原文转载地址:http://blog.csdn.net/sunchaoenter/article/details/6646001 增加自己的想法,作为笔记. 这里&是取地址运算符,*是间接运算符. &a 的运算结果是一个指针,指针的类型是a 的类型加个*,指针所指向的类型是a 的类型,指针所指向的地址嘛,那就是a 的地址. *p 的运算结果就五花八门了.总之*p 的结果就是(注意这里,就是)p 所指向的东西,这个东西有这些特点:它的类型是p 指向的类型,它所占用的地址是p所指向的地址. ;…
原文转载地址:http://blog.csdn.net/sunchaoenter/article/details/6587426 增加自己的想法,作为笔记. 1.概述 许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误.本文将对void关键字的深刻含义进行解说,并详述void及void指针类型的使用方法与技巧. 2.void的含义 void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据. void几乎只有“注释…
本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 & 是取地址运算符.* 叫做指针运算符或间接运算符.&a 的运算结果是一个指针,指针的类型是a的类型加上*.指针所指向的类型是a的类型,指针的值也就是指针所指向的内存区就是a的地址. *p的运算结果就多了,总之.*p的结果是p所指向的东西,这个东西有这些特点: 它的类型是p所指向的类型,它所占用的地址是p所指向的地址. 看以下的样例: int a = 5; int b;…
1. ++.--.+.- int a=100; a+1; 对比: int *p=xxx;  [0x12] p+1;           [0x12+1*sizeof(*p)] 指针的加法(减法)运算,实际上加(减)的是一个单位,单位的大小可以使用sizeof(p(0))获得 int *p   p+1 char *p p+1 p++  p-- 更新地址 2. [  ] 变量名[n] n:ID b标签 地址内容的标签访问方式 取出标签里的内存值 3. 逻辑操作符 >=       <=     …
int y=0; int* yptr=&y; •互相反作用 •*&yptr -> * (&yptr) -> * (yptr的地址)-> 得到那个地址上的变量 -> yptr •&*yptr -> &(*yptr) -> &(y) -> 得到y的地址,也就是yptr -> yptr…
一.C++ vector::data()函数 返回值类型:vector的基类 返回值:Returns a pointer such that [data(), data() + size()] is a valid range. For a non-empty %vector, data() == &front(). 等价于:&vector::front() 例子 //基类型定义 class Token { private: int lineshow; //记录该单词在原程序中的行数 st…
一.指向函数的指针 函数名可以在表达式中被解读成“指向函数的指针”,因此,正如代码清单 2-2 的实验那样,写成 func 就可以取得指向函数的指针. “指向函数的指针”本质上也是指针(地址),所以可以将它赋给指针型变量. 比如有下面的函数原型: int func(double d); 保存指向此函数的指针的变量的声明如下: int (*func_p)(double); 然后写成下面这样,就可以通过 func_p 调用 func, int (*func_p)(double); // 声明 fun…
关键概念: 1.多个不同类型的指针可以对应同一个地址: 2.(&p)则是这样一种运算,返回一个指针,该指针的值是当时声明p 时开辟的地址,指针的类型是p的类型对应的指针类型: 3.(*p)操作是这样一种运算,获取指针p的值(变量的地址)找到对应的变量的值-----返回以(p 的值作为地址)的那个空间的值.但是如果这个变量本身就是一个地址,那么(*p)获取的值也是一个指针: 4.在数组中,指针的&,*运算符比较特殊,与普通变量的指针并不相同: 5.数组名不是一个该数组的指针: 一维数组 #i…
指针变量是包含内存地址的变量.一般的变量直接包含一个特定的值,而指针变量包含的是某一特定数据类型的内存地址.普通变量直接引用其中的值,指针变量则间接引用所指向内存地址中的值.指针变量在使用前需要声明与初始化. 4.5.1 指针变量的定义 指针变量定义时,需要指定所指向的数据类型.声明指针变量的一般形式为: 数据类型  *变量名 “*”运算符通常称为 间接运算符 或 间接引用运算符,在声明中以这种方式使用间接运行符时,它用以表明被声明的变量是指针变量.如下例所示: int *pi; // 声明一个…
1.操作符函数: 在特定条件下,编译器有能力把一个由操作数和操作符共同组成的表达式,解释为对 一个全局或成员函数的调用,该全局或成员函数被称为操作符函数.该全局或成员函数 被称为操作符函数.通过定义操作符函数,可以实现针对自定义类型的运算法则,并使之 与内置类型一样参与各种表达式运算. 2.首先我们先介绍下左值和右值,因为我们在运用运算符的时候要尽量和内置类型的一致性. 左值:有名的可以直接取地址的我们称之为左值,左值的特性是可以修改的. 右值:右值主要是一些临时变量,匿名变量,字符串字面值常量…
C++标准转换运算符reinterpret_cast reinterpret_cast <new_type> (expression) reinterpret_cast运算符是用来处理无关类型之间的转换:它会产生一个新的值,这个值会有与原始参数(expressoin)有完全相同的比特位. 什么是无关类型?我没有弄清楚,没有找到好的文档来说明类型之间到底都有些什么关系(除了类的继承以外).后半句倒是看出了reinterpret_cast的字面意思:重新解释(类型的比特位).我们真的可以随意将一个…
原文地址:https://msdn.microsoft.com/zh-cn/library/y31yhkeb.aspx 在不安全的上下文中,类型可以是指针类型.值类型或引用类型. 指针类型声明采用下列形式之一:     type* identifier; void* identifier; //allowed but not recommended 以下任一类型均可为指针类型: sbyte.byte.short.ushort.int.uint.long.ulong.char.float.doub…
如何:获取指针变量的值 使用指针间接运算符可获取位于指针所指向的位置的变量. 表达式采用下面的形式,其中, p 是指针类型: *p; 不能对除指针类型以外的任何类型的表达式使用一元间接寻址运算符. 此外,不能将它应用于 void 指针. 当向 null 指针应用间接寻址运算符时,结果将取决于具体的实现. 示例 下面的示例使用不同类型的指针访问 char 类型的变量. 注意,theChar 的地址在不同的运行中是不同的,因为分配给变量的物理地址可能会更改. unsafe class TestCla…
在C#的不安全的代码书写中,类型可以是指针类型.值类型或引用类型. 指针类型声明具有下列形式之一:   type* identifier; void* identifier; //allowed but not recommended 下列类型都可以是指针类型: sbyte.byte.short.ushort.int.uint.long.ulong.char.float.double.decimal 或 bool. 任何枚举类型. 任何指针类型. 仅包含非托管类型的字段的任何用户定义的结构类型.…
c之精髓——指针(pointer)——用来存储地址的变量.一般来讲,指针是一个其数值为地址的变量(或更一般地说是一个数据对象). 一元运算符&可以取得变量的存储地址,一个变量的地址可以被看作是该变量在内存中的位置. 地址运算符&:后跟一个变量名时,&给出该变量的地址. 间接运算符*:当后跟一个指针名或地址时,*给出存储在被指向地址中的数值. 指针声明,举例如下: int * pi; char * pc; // pc所指向的值(*pc)是char类型的,而pc本身又是什么类型?我们把…
5.运算符重载 5.1 在类外定义的运算符重载函数 C++为运算符重载提供了一种方法,即在运行运算符重载时,必须定义一个运算符重载函数,其名字为operator,后随一个要重载的运算符.例如,要重载"+"号,应该写一个名字为operator的函数,其他的运算符也是如此. 函数 功能 operator+ 加法 operator- 减法 operator* 乘法 operator< 小于 因此,若要两个对象相加,需要先定义一个运算符重载函数operator+,例如: class Co…
在前一节中曾提到过,C++中运行时的多态性主要是通过虚函数来实现的,而编译时的多态性是由函数重载和运算符重载来实现的.这一系列我将主要讲解C++中有关运算符重载方面的内容.在每一个系列讲解之前,都会有它的一些基础知识需要我们去理解.而运算符重载的基础就是运算符重载函数.所以今天主要讲的是运算符重载函数. 1.运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用域不同类型的数据导致不同行为的发生.比如 int i; ,i2=; i=i1+i2; std::cout<<"i1+i2…
(1)C++不允许用户自己定义新的运算符,只能对已有的C++运算符进行重载. 例如,有人觉得BASIC中用“* *”作为幂运算符很方便,也想在C++中将“* *”定义为幂运算符,用“3* *5”表示35,这是不行的. (2)C++允许重载的运算符 C++中绝大部分运算符都是可以被重载的. 不能重载的运算符只有5个: .             (成员访问运算符) .*            (成员指针访问运算符) ::             (域运算符) sizeof    (长度运算符) ?…
C++学习之运算符重载的总结              运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用域不同类型的数据导致不同行为的发生,C++为运算符重载提供了一种方法,即运算符重载函数.其函数名字规定为operator后紧跟重载运算符.比如:operator+(),operator*()等. (1)运算符重载函数作为类的友元函数的形式: class 类名 { friend 返回类型 operator运算符(形参表); } 类外定义格式: 返回类型 operator运算符(参数表)…
[运算符]        在进行运算时,假设右括号的话我们知道先运算哪个,那假设没有括号了.算术运算符,关系运算符,逻辑运算符,位运算符.赋值运算符,++.--运算符等等,那么多的运算符.我们先算哪边.也就是这些运算符的优先级怎么排序呢? 优先级 操作符 描写叙述 样例 结合性 1 () [] -> . :: ++ -- 调节优先级的括号操作符 数组下标訪问操作符 通过指向对象的指针訪问成员的操作符 通过对象本身訪问成员的操作符 作用域操作符 后置自增操作符 后置自减操作符 (a + b) /…
原文:深入理解C指针之四:指针和数组 数组是C内建的基本数据结构,数组表示法和指针表示法紧密关联.一种常见的错误认识是数组和指针完全可以互换,尽管数组名字有时可以当做指针来用,但数组的名字不是指针.数组和指针的区别之一就是,尽管数组的名字可以返回数组地址,但是名字不能作为赋值操作的目标. 概述 数组是能用索引访问的同质元素连续集合.数组的元素在内存中是相邻的,而且元素都是同一类型的.数组的长度是固定的,realloc函数和变长数组提供了应对长度需要变化的数组的技术. 一维数组是线性结构,用一个索…
函数 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //参数传值调用 在C语言中,被调函数不能直接修改主调函数中变量的值,而只能修改函数私有的临时副本的值 必要时,也能够修改主调函数中的变量.需要向被调用函数提供待设置值的变量的地址(指针).被调用函…
今天上计算机系统课的时候老师讲到了C中的聚合类型的数据结构.在解释数组名的时候说"数组名是一个指针,指向该数组的第一个元素",附上ppt(第二行): 我觉得这是不正确的,是一个常见的由"简化"产生的错误,数组名 != 指针.数组名是一个标识符,它标识出我们之前申请的一连串内存空间,而且这个空间内的元素类型是相同的--即数组名代表的是一个内存块及这个内存块中的元素类型 .只是在大多数情况下数组名会"退化"(C标准使用的decay和converted…
1.1 一维数组 一维数组的声明: int a[10]; 这里a就是一个数组. 数组a的类型就是一个指向整型的常量指针. 但是数组和指针是**不相同**的. **数组具有特定数量的元素,而指针只是一个标量值.** 只有但数组名在表达式中使用时,编译器才会为它产生一个指针常量.(注意是指针常量,不是指针变量) 1.2 数组下标 如有 int b[10]; 则 *(b + 3) 代表的就是b[3] 除了优先级之外,下标引用和间接访问完全相同 所以 array[subscript] 和 (array…
目录 算术运算符 注意事项 赋值运算符 逻辑运算符 短路与和短路或 关系运算符 位运算符 其他运算符 运算符优先级 运算符用于在程序运行时执行数学或逻辑运算. Go 语言内置的运算符有:算术运算符.赋值运算符.逻辑运算符.关系运算符.位运算符.其他运算符 算术运算符 算数运算符是对数值型的变量进行运算的,比如:加减乘除,在Go程序中使用的非常多. 下表列出了所有Go语言的算术运算符.假定 A 值为 10,B 值为 3. 运算符 描述 实例 + 相加 A + B 输出结果13 - 相减 A - B…
我们可以重定义或重载大部分 C++ 内置的运算符.这样,就能使用自定义类型的运算符. 重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的.与其他函数一样,重载运算符有一个返回类型和一个参数列表. Box operator+(const Box&); 声明加法运算符用于把两个 Box 对象相加,返回最终的 Box 对象.大多数的重载运算符可被定义为普通的非成员函数或者被定义为类成员函数.如果我们定义上面的函数为类的非成员函数,那么我们需要为每次操作…
运算符重载 重载的运算符是具有特殊名字的函数:它们的名字由关键字operator和其后要定义的运算符号共同组成.重载的运算符是遵循函数重载的选择原则,根据不同类型或不同参数来选择不同的重载运算符. 运算符重载的基本语法 成员函数形式 <类名> operator<符号>(<参数表>) 参数表列出该运算符需要的操作数. 运算符函数体对重载的运算符的含义做出新的解释.这种解释仅局限在重载该运算符的类中,即当在X类对象的关联中,运算符含义由函数体解释:否则脱离类对象,该运算符具…
C++ 重载运算符和重载函数 C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载. 重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列表和定义(实现)不相同. 当您调用一个重载函数或重载运算符时,编译器通过把您所使用的参数类型与定义中的参数类型进行比较,决定选用最合适的定义.选择最合适的重载函数或重载运算符的过程,称为重载决策. C++ 中的函数重载 在同一个作用域内,可以声明几个功能类似的同名函数,但是这些同名函数的…
重载运算符和重载函数C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载.重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列表和定义(实现)不相同.当您调用一个重载函数或重载运算符时,编译器通过把您所使用的参数类型与定义中的参数类型进行比较,决定选用最合适的定义.选择最合适的重载函数或重载运算符的过程,称为重载决策. C++ 中的函数重载在同一个作用域内,可以声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数…
指针1.指针的概述 指针是什么? 指针是一个地址 是一个常量 int 整型 int a a是变量 指针用来做什么? 方便使用数组或者字符串 像汇编语言一样处理内存地址2.指针变量 什么是指针变量? 是一个可以存储地址的一个“容器” 经常会吧指针变量 读作指针 后面吧地址当做“指针” 吧存储地址的变量叫做“指针变量” 3.指针赋值 类型说明符 * 变量名=地址值: int a=89; int *p=&a; 定义了一个int* 类型的变量p (类型跟*是一对好基友) 之后给这个变量赋值a的地址 &am…