指针

四、C++指针与引用

孤者浪人 提交于 2020-03-12 11:35:46
C++指针与引用 1.指针 1.1C++空指针 1.2指针运算 1.4指向指针的指针 1.5传递指针给函数 1.6从函数中返回指针 2.引用 2.1引用和指针的区别 2.2C++中创建引用 2.3把引用作为参数 2.4把引用作为返回值 1.指针 每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字符(&)运算符访问的地址,他表示在内存终端地址: # include <iostream> using namespace std ; int main ( ) { int var1 ; char var2 [ 10 ] ; cout << "var1 变量的地址: " ; cout << & var1 << endl ; cout << "var2 变量的地址: " ; cout << & var2 << endl ; return 0 ; } 指针是一个变量,其值为另一个变量的地址,即内存位置的直接地址。 指针进行声明: type * var - name ; int * ip ; //声明一个整形指针; char * ch ; //声明一个字符性指针; //不管时什么类型都代表内存地址的长的16位禁止; 指针使用实例: # include <iostream> using namespace std ; int main ( ) { int var = 20 ; //

Linux常用多线程函数

巧了我就是萌 提交于 2020-03-12 11:29:55
Linux多线程函数用得比较多的是下面的3个 pthread_create(),pthread_exit(),pthread_join();它们都是在头文件之中。编译时需要加静态库-lpthread 下面是函数的说明:   pthread_create是UNIX环境创建线程函数 int pthread_create( pthread_t *restrict tidp, const pthread_attr_t *restrict_attr, void*(*start_rtn)(void*), void *restrict arg); 返回值   若成功则返回0,否则返回出错编号   返回成功时,由tidp指向的内存单元被设置为新创建线程的线程ID。attr参数用于制定各种不同的线程属性。新创建的线程从start_rtn函 数的地址开始运行,该函数只有一个万能指针参数arg,如果需要向start_rtn函数传递的参数不止一个,那么需要把这些参数放到一个结构中,然后把 这个结构的地址作为arg的参数传入。   linux下用C开发多线程程序,Linux系统下的多线程遵循POSIX线程接口,称为pthread。   由 restrict 修饰的指针是最初唯一对指针所指向的对象进行存取的方法,仅当第二个指针基于第一个时,才能对对象进行存取。对对象的存取都限定于基于由 restrict

《深度探索C++对象模型》第三章:Data 语意学

ぃ、小莉子 提交于 2020-03-12 11:22:57
sizeof 内存对齐的一些规则: #pragma pack(n) 预编译指令,可用来设置多少个字节对齐,n的缺省数值是按照编译器自身设置,一般为8,合法的数值分别是1、2、4、8、16,其它的无效。 offset从0开始,每个数据成员开始存放的offset值为min(n, 数据成员大小)的整数倍。 在数据成员完成各自的存放之后,整个类也将进行内存对齐,其大小为min(n, 整个类中最大成员的大小)的整数倍。 如果一个类是空类,即里面无任何数据成员,那么它会有一个隐藏的1 byte 大小,那是被编译器安插进去的一个char,这使得两个objects得以在内存中配置独一无二的地址。 sizeof的大小受到三个因素的影响: 语言本身所造成的额外负担(vptr、vbptr(有些编译器有,也有可能会共用vptr)) 编译器对于特殊情况所提供的优化处理(如空类) 内存对齐的限制 class X {}; class Y : public virtual X {}; class Z : public virtual X {}; class A : public Y, public Z {}; int main() { cout << sizeof(X) << endl; //1 cout << sizeof(Y) << endl; //4 cout << sizeof(A) << endl; /

c语言指针

限于喜欢 提交于 2020-03-12 10:02:56
1. 指针是一种数据类型 如:int * ,char * ,*单目运算符,表示指针上的变量; 2.取变量的地址用& 如int a = 1; int * p = &a 表示把指向a的内存地址赋给 指针变量 p; 3.指针变量可以做左值,也可以做右值 如 int a = 1; int * p = &a; int b = *p; ( 右值) *p = 2; ( 左值 ) 4.数组指针(指向数组中第一个元素的常量指针) 如 int k[] = {0,1,2,3}; (数组变量k本身表达地址) int * p = k; p = k[0] p = &k; 来源: https://www.cnblogs.com/wasoft/p/12467234.html

delete指针以后应赋值为NULL

删除回忆录丶 提交于 2020-03-12 08:38:03
delete指针以后应赋值为NULL delete p后,只是释放了指针中存放的地址中的内存空间。但是指针变量p仍然存在(即指针p本身所占有的内存),且p中存放的地址还是原来的地址。 例如: 对一个非空指针delete后,若没有将p赋为NULL,若再次delete的话,会出现问题。 如下代码: # include <iostream> int main ( ) { int * p = new int ( 3 ) ; delete p ; delete p ; return 0 ; } 在ubuntu14.04中使用g++进行编译无问题,但运行时报错如下: 意思就是对同一指针变量进行了两次释放内存的操作,这是不合法的。 因为第一次释放后,指针p指向的那块区域已经变为不可访问区域了,再执行一次delete p,试图对一块不可访问的区域进行释放,这是不合法的。 将其改为: # include <iostream> int main ( ) { int * p = new int ( 3 ) ; delete p ; p = NULL ; delete p ; return 0 ; } 则编译和运行都没有问题,因为C++保证delete值为NULL的指针是安全的。 ///////////////////////////////////////////////////////////////

C指针方面笔试题分享

て烟熏妆下的殇ゞ 提交于 2020-03-12 05:14:44
今天总结分享几个关于C语言指针方面的一些笔试题,主要是对前些日子练习的一些总结,同样也希望看到这篇文章的人,对你能有所帮助。如果有错误的部分,也希望即使指正 笔试题1. `int main(){ int a[5] = { 1, 2, 3, 4, 5 }; int *ptr = (int *)(&a + 1); printf( "%d,%d", *(a + 1), *(ptr - 1)); return 0; }` 程序的运行结果是什么 首先,从这段代码中可以看到定义了一个长度为5的数组a,然后定义了一个指针ptr,将 ptr指向(int*)(&a+1),(&a+1)数组名取地址再加1,是跳过整个数组,指向a[4] 后面的地址,(int*)再将int(*)[5]类型的变量强转为int(*)类型,然后打印 *(a+1),数组名加1,在C语言中a将强制转换为a[0]的地址意味着数组的首元素地址向 后跳过一个元素即为a[1]的地址,在解引用打印数字为2,*(ptr-1)则是将ptr指针向前 跳过sizeof(int)个字节,在解引用,于是打印的结果回事a[4]中的数值,也就是5, 于是此题的答案则为2,5 笔试题2. struct Test { int Num ; char * pcName ; shortsDate ; char cha [ 2 ] ; shortsBa [ 4 ] ;

C++不常用设计模式梳理

僤鯓⒐⒋嵵緔 提交于 2020-03-12 04:58:22
C++常用设计模式的相关博文到这里就整理的差不多了,我们实际工作中常用的设计模式就是我前面整理的那些。GoF所提到的23种设计模式还有一些我没有整理到,包括:享元模式、建造者模式、外观模式、中介者模式、备忘录模式、迭代器模式、职责链模式、访问者模式、命令模式、解释器模式。这些模式因为各种各样的原因在我们的工作中很少会遇到,所以这篇博文就先对这些剩下的模式做一个简单的介绍。 1,享元模式 定义:运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用。 UML图: 我的理解: 第一次看到享元模式的定义我就很蒙圈,首先是它的英文名称叫flyweight,翻译成轻量级我觉得更合适一点。其次是啥叫细粒度?其实不就是一些轻量级(更直接的一点的说法就是对象sizeof()得出来的结果很小)的对象嘛。那么多少这些对象可以称为大量呢?假设我们某个类的对象a使用sizeof()得出来的结果50个字节。那20*1024个a对象的大小差不多就是1M,除了一些网络游戏应用我想不出哪些地方会用到这么多的对象,反正我工作中是遇不到这么多的对象创建。享元模式给出的解决方法其实就是UML图中红色的部分。这个方法非常的经典,很多地方都可以使用这个方法,比如:线程池、内存池等等。因此掌握这个方法非常重要! 其核心思想就是:维护一个对象池

成员函数的指针长度

荒凉一梦 提交于 2020-03-12 04:56:09
class A{ }; class C : public virtual A{ public: void f1() {} }; 猜猜 &C::f1 函数指针的大小是多少? int _tmain(int argc,_TCHAR *argv[]) {   printf("%d",sizeof(&C::f1));   return 0; } 显示 12   --君君 是要写这么个功能发现的:将所有的函数用个void*存起来,后面再拿出来调用,会出错,发现void*不够存上面那个指针大小   --滔滔 原因 http://bbs.gimoo.net/thread/214108-1.html 在32位win7操作系统中,一般函数指针的长度为4个字节(32位),而类的成员函数指针的长度随类的定义与否、类的继承种类和关系而变,从无继承关系类(Test3)的4字节(32位)到有虚继承关系类(Virtual Inheritance)(Test4)的12字节(96位),仅有说明(declaration)没有定义的类(Test)因为与其有关的一些信息不明确成员函数指针最长为16字节(128位)。显然, 与一般函数指针不同,指向“类”的成员函数的指针不仅包含成员函数地址的信息,而且包含与类的属性有关的信息,因此,一般函数指针和类的成员函数指针是根本不同的两种类型,当然

const真香

守給你的承諾、 提交于 2020-03-11 14:28:00
这个const,用着用着,竟不断发现它有许多长处,对它的好感度日渐攀升,觉得它有这般价值和意义,实在值得拥有一篇自己的专栏 1.用 const限定数据 本身可以避免不小心修改这个数据。 2.用const 限定指针 ,保证指针永远指向这个值。 比如,把1和2合并起来用 const char * const char months [ 12 ] = { "January" , "Februry" , "March" , "April" , "May" , "June" , "July" , "August" , "September" , "October" , "Novenmber" , "December" } ; 这个数组保护的特别周全,两道屏障,第1个const保证了数组是常量数组,元素都是常量,即不能通过这个指针来修改数组元素的值;第2个const保证了指针是const常量,即永远指向这个数组的第一个字符串 这种常量数组通常都是定义为 外部变量 即全局变量的,所有文件的函数都可以访问。 3.用 const形参 使函数可以处理const和非const数据,但是普通形参只能处理非const数据。 4.用 const引用 可以使得函数在传入的参数类型不匹配或者类型对但是是常量值时,生成匿名的临时变量作为引用变量,保证函数正确完成任务。所以 通常直接把引用形参声明为const 。 5

走远了吗. 提交于 2020-03-11 10:57:34
树是由结点或顶点和边组成的(可能是非线性的)且不存在着任何环的一种数据结构。 基本概念 : 1)兄弟结点——拥有同一个父结点的结点; 2)孩子、双亲——结点的子树的根称为该节点的孩子,相应地,该节点称为孩子的双亲; 3)结点的度——一个结点所包含子树的数量; 4)树的度——该树所有结点中最大的度; 5)叶子结点——树中度为零的结点,也叫终端结点; 6)结点的层数——从根结点开始算,根结点是第一层,依次往下。 7)树的深度——树中结点的最大层数 8)有序树——树中的各结点的 子树(兄弟结点 )从左到右按一定次序去排列的树; 9)森林—— m(m>=0) 棵 互不相交 的树的集合。    存储结构: 1)双亲表示法——在每个结点的结构中,附设一个字段记录其双亲结点在数组中的位置 结点结构如图 : , data是数据域,存储节点的数据信息,parent是指针域,存储该节点的双亲在数组中的下标 /*树的双亲表示法节点结构定义*/ #define MAX_TREE_SIZE 100 typedef int TElemType /*树结点数据类型,目前暂定为整型*/ typedef struct PTNode/*结点数据结构*/ { TElemType data; /*结点数据*/ int parent; /*双亲位置*/ }PTNode; typedef struct/*树结构*/ {