指针变量

C 指针精要

∥☆過路亽.° 提交于 2020-03-31 13:29:15
C 指针精要 http://blog.csdn.net/lwbeyond/article/details/6180640 一. 解读复杂指针声明 要理解复杂类型其实很简单,一个类型里会出现很多运算符,他们也像普通的表达式一样,有优先级,其优先级和运算优先级一样. 记住原则: 从变量名处起,根据运算符优先级结合,一步一步分析. int p; /* 这是一个普通的整型变量 */ int *p; /* 首先从P 处开始,先与*结合,所以说明P 是一个指针, 然后再与int 结合,说明指针所指向的内容的类型为int 型. 所以P 是一个返回整型数据的指针 */ int p[3]; /* 首先从P 处开始,先与[]结合,说明P 是一个数组, 然后与int 结合,说明数组里的元素是整型的. 所以P 是一个由整型数据组成的数组 */ int *p[3]; /* 首先从P 处开始,先与[]结合,因为其优先级比*高,所以P 是一个数组, 然后再与*结合,说明数组里的元素是指针类型, 然后再与int 结合,说明指针所指向的内容的类型是整型的 所以P 是一个由返回整型数据的指针所组成的数组 */ int (*p)[3]; /* 首先从P 处开始,先与*结合,说明P 是一个指针 然后再与[]结合,说明指针所指向的内容是一个数组 然后再与int 结合,说明数组里的元素是整型的. 所以P

C++基本功:全面掌握const、volatile和mutable关键字

时光怂恿深爱的人放手 提交于 2020-03-31 13:18:40
C++ 程式设计过程中 ,const 的使用可以频度是非常高的 . 它在保证程式安全方面起到了不可估量的作用 . 用一句话来表达最确切不过了:"小兵立大功" . 有了 const, 那么 mutable 当然缺不了 . 然作为 const 的同胞兄弟 ,volatile 却在很多人的视野中消失 . 其实 volatile 担负的责任有何尝小呢 ? 自然 , 它们的用法多样而灵巧 , 以至新手迷惑久久 , 下面就来系统的探讨总结一下吧: 一 . 一般应用 1.const 修饰各种变量的用法 . a. 取代 define #define D_INT 100 #define D_LONG 100.29 ……… const int D_INT = 100; const D_INT = 100; // 如果定义的 int 类型 , 可省略 int. const long D_LONG = 100.29; ……… const int& a = 100; const 替代 define 虽然增加分配空间 , 可它却保证了类型安全 . 在 C 标准中 ,const 定义的数据相当于全局的 , 而 C++ 中视声明的位置而定 . b. 修饰指针相关的变量 以三组简单的定义示意: Group1: int a = 0; const int* b = &a;------------ [1] int

define和typedef

梦想的初衷 提交于 2020-03-31 00:43:35
参考: 【C++】define 和typedef 的详细区别 define与typedef区别与联系 #define(宏定义)只是简单的字符串代换(原地扩展),它本身并不在编译过程中进行,而是在这之前(预处理过程)就已经完成了。 typedef是为了增加可读性而为标识符另起的新名称(仅仅只是个别名),它的新名字具有一定的封装性,以致于新命名的标识符具有更易定义变量的功能,它是语言编译过程的一部分,但它并不实际分配内存空间。 一般都遵循#define定义“可读”的常量以及一些宏语句的任务,而typedef则常用来定义关键字、冗长的类型的别名。 typedef是语句( 以';'结尾),而#define不是语句( 不以';'结尾) typedef int * int_ptr; #define INT_PTR int * const int_ptr p; //p不可更改,但p指向的内容可更改 const INT_PTR p; //p可更改,但是p指向的内容不可更改 int_ptr是一种类型(类型本身就是整型指针),const int_ptr p就是把指针给锁住了p不可更改,而const INT_PTR p是const int * p锁的是指针p所指的对象。这些使用常常使我迷惑,所以搜集整理对他们的理解如下: #define的用法: 1、简单的宏定义 #define MAXTIME

c++学习笔记

社会主义新天地 提交于 2020-03-30 21:50:51
1 函数 1.1 内联函数 inline bool isNumber ( char c ) { return ( c == '1' ); } int main ( int argc , _TCHAR * argv []) { //cout<<" Hello World! \n"; //printf("Hello World!"); if ( isNumber ( '1' )) printf ( "It is a Number" ); else printf ( "It isn't a Number" ); return 0; } 这种用 inline 定义的函数就是内联函数。 内联函数的出现是为了解决效率问题; 内联函数的函数体一般在 1 - 5 行之间; 内联函数内部不允许有控制语句,如果有控制语句,则它只会被当作一般的函数。 2 程序结构 2.1 外部存储类型 默认的函数声明或定义总是 extern 的; 带 extern 的是变量声明,不是变量实现; 2.2 静态函数 在 c++ 中所谓的静态函数和 c #中的是不同的,函数之所以声明为 static ,是为了和 extern 不同,就是让该函数只在这个文件内有效。 2.3 作用域 主要可以分为以下几种: l 局部作用域; void fn () { if ( int i == 5) //i 的作用域自此开始 i = 2* i

Go语言入门(六)结构体后续&指针

坚强是说给别人听的谎言 提交于 2020-03-30 17:25:16
结构体后续&指针 指针 变量和内存地址 每个变量都有内存地址,可以通过变量来操作对应的内存 func varMem() { var a int32 = 100 fmt.Printf("addr %p\n",&a) } func pointMem() { var b int32 b = 32 var a *int32 fmt.Printf("addr of a:%v\ntype of a %T\n",a,a) //取出a的地址和类型 a = &b fmt.Printf("a %d addr:%p\ntype of a:%T\nb %d addr %p\n",*a,&a,a,b,&b) } 指针的定义与取值 & : 取地址 * : 取指针对应的值 充分判断指针为nil的情况 func pointMem1() { var a *int b := 200 a = &b *a = 400 fmt.Printf("a=%v,adda=%p,type a=%#T\nb=%v,addb=%p,type b=%#T\n",*a,a,a,b,&b) } func pointMem2() { var a *int var b int = 100 if a == nil { a = &b } fmt.Printf("addr a=%p,value a=%d\naddr b=%p,value b=%d\n"

c++学习笔记:多态

僤鯓⒐⒋嵵緔 提交于 2020-03-30 17:21:18
1.多态:通常是指对于同一个消息、同一种调用,在不同的场合,不同的情况下,执行不同的行为--->重载便是简单的多态 ------->指同一个操作作用于不同的对象就会产生不同的响应; 多态性分为静态多态性和动态多态性   其中函数重载和运算符重载属于静态多态性, 虚函数属于动态多态性---->C++是依靠虚函数来实现动态多态的。 2.C++编译器根据传递给函数的参数和函数名决定具体要使用哪一个函数,称为联编:   1)在编译过程中进行的联编叫静态联编(static binding)或早期联编(early binding)。   2)在程序运行时完成,动态联编”(dynamic binding)也叫晚期联编(late binding)---->C++通过虚函数来实现动态联编 3.虚函数:vitual   1.与基类的虚函数有相同的参数个数;   2.与基类的虚函数有相同的参数类型;   3.与基类的虚函数有相同的返回类型。   注意点:1. 基类的成员函数定义为虚函数,那么,它在所有派生类中也保持为虚函数;即使在派生类中省略了virtual关键字,也仍然是虚函数。       2.构造函数不可为虚函数--->一旦为虚函数相当于重新,在构造子类时无法找到基类构造函数从而无法构造对象。       ( 1. 根据继承的性质,构造函数执行顺序是: A() B() 2. 根据虚函数的性质

星号的秘密

北慕城南 提交于 2020-03-30 17:20:42
1 、乘法运算符 2 、定义指针 int *p = 0; 还是 int* p = 0;? 后一种比较容易这样理解:定义了一个变量p,它是指针型的(更详细一点,是指向int的指针型),相比而言,前面一种定义似乎是定义了*P这个奇怪的东西。但是后面一种写法会带来一个容易产生的误解: int* p1, p2; 这儿给人的感觉似乎是定义了两个指针型变量p1和p2,但是,事实上,这种直觉是错误的,正确的理解方式是int *p1, p2;即p1是指针型的,而p2确是整型的。 在MS VC++ 6.0中,是按照后面一种格式写的。 3 、何谓指针? 指针仅仅表示一个内存中的某个地址? 非也,注意到,我们在定义指针的时候,都关联了一个类型,如int,char,或者是string等等,如果说指针仅仅表示一个内存中的地址,那何必要关联这么多变化的东西呢?完全可以DWORD p=0;这样解决问题。 关联了的数据类型是作何用的呢? 它可以指示编译器怎样解释特定地址上内存的内容,以及该内存区域应该跨越多少内存单元。如 int *p; 编译器可以从这个定义中获得信息:1、p指向的内存存放的是整型数据,2、由于该内存区域只存放了一个数据,跨越的内存区域为4个字节,即p+1的效果是跳过了四个字节。 另一个复杂一点的例子,如 struct a {int x1; short x2; a *next; } 定义指针 a

C++_系列自学课程_第_8_课_指针和引用_《C++ Primer 第四版》

偶尔善良 提交于 2020-03-30 17:15:54
   C语言最富有迷幻色彩的部分当属指针部分,无论是指针的定义还是指针的意义都可算是C语言中最复杂的内容。指针不但提供给了程序员直接操作硬件部分的操作接口,还提供给了程序员更多灵活的用法。C++继承这一高效的机制,同时引入了另一个与指针相似但 不相同的机制: 引用。 一、引用   简单的来说,引用就是变量的别名(alias), 通过别名我们可以操作引用代表的变量。 定义一个引用的语法如下所示:     变量类型 &引用标识符 = 变量名。 Exp:   int iVar=10;   int &iRef = iVar;   iRef = 20 ;   cout<<iVar<<endl;   这段程序执行的结果就是输出: 20 ;   程序通过引用 iRef 改变了变量iVar的值。 要点:   1、在定义引用的同事必须初始化,指出引用代表的是哪一个变量,而且这种“指向关系”不能改变。   2、引用只是对象的另一个名字,可以通过对象的原标识符访问对象,也可以通过对象的引用访问对象。   3、在一个语句定义多个引用的时候,每个引用标识符(引用名)的前面必须都加上&符号,否则就是错误。 1、const引用   const引用是指向const对象的引用, 不能通过const引用改变原对象的值。如下所示: 1 #include <iostream> 2 #include <string> 3

C++星号的含义

爷,独闯天下 提交于 2020-03-30 17:03:04
1 、乘法运算符 2 、定义指针 int *p = 0; 还是 int* p = 0;? 后一种比较容易这样理解:定义了一个变量p,它是指针型的(更详细一点,是指向int的指针型),相比而言,前面一种定义似乎是定义了*P这个奇怪的东西。但是后面一种写法会带来一个容易产生的误解: int* p1, p2; 这儿给人的感觉似乎是定义了两个指针型变量p1和p2,但是,事实上,这种直觉是错误的,正确的理解方式是int *p1, p2;即p1是指针型的,而p2确是整型的。 在MS VC++ 6.0中,是按照后面一种格式写的。 3 、何谓指针? 指针仅仅表示一个内存中的某个地址? 非也,注意到,我们在定义指针的时候,都关联了一个类型,如int,char,或者是string等等,如果说指针仅仅表示一个内存中的地址,那何必要关联这么多变化的东西呢?完全可以DWORD p=0;这样解决问题。 关联了的数据类型是作何用的呢? 它可以指示编译器怎样解释特定地址上内存的内容,以及该内存区域应该跨越多少内存单元。如 int *p; 编译器可以从这个定义中获得信息:1、p指向的内存存放的是整型数据,2、由于该内存区域只存放了一个数据,跨越的内存区域为4个字节,即p+1的效果是跳过了四个字节。 另一个复杂一点的例子,如 struct a {int x1; short x2; a *next; } 定义指针 a

指向函数的指针数组

拟墨画扇 提交于 2020-03-30 16:48:25
#include<iostream> using namespace std; int f1() { return 0; } int f2() { return 0; } int f3() { return 0; } int f4() { return 0; } int main() { int (*a[])()={&f1,&f2,&f3,&f4}; for(int i=0;i<4;++i) { a[i](); } } 应该注意的是这几个函数的参数必须一致,比如在这里都为空,同时返回值也必须是同一类型,如 上例返回值为void类型。 在弄清上面的问题的前提是必须清楚 指针函数和函数指针 的区别 指针函数是指带指针的函数,即本质是一个函数。函数返回类型是某一类型的指针 类型标识符 *函数名(参数表) int *f(x,y); 函数指针是指向函数的指针变量,即本质是一个指针变量。  int (*f) (int x); /* 声明一个函数指针 */  f=func; /* 将func函数的首地址赋给指针f */ 主要的区别是一个是指针变量,一个是函数。在使用是必要要搞清楚才能正确使用。 来源: https://www.cnblogs.com/zhouyz/archive/2010/08/19/1803997.html