c语言指针

28-指针的定义和初始化

牧云@^-^@ 提交于 2020-02-26 05:28:10
本节知识点: 1、指针变量 2、定义一个指针变量 3、指针变量的引用 4、指针变量的初始化方法 5、使用*获取指针对应存储区域的内容 ---------------------------------------------------------------------------------------------------- 1、指针变量    在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。   因此,一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。 注意,严格意义上讲:    指针 是一个地址, 是一个常量。    指针变量 是存放一个地址, 是一个变量。 指针变量用于存放指针(地址)。 对比整型数据理解:int a = 10;   10 是一个整型数据, 是一个常量   整型变量a是存放整型数据的,是一个变量。 图中:变量i_pointer 就是一个指针变量,查看k = i + j; 的存储过程 2、定义一个指针变量 对指针变量的定义包括3个内容:   (1) 指针类型说明,即定义变量为一个指针变量   (2) 指针变量名   (3) 变量值(指针) 一般形式为: 类型说明符 *变量名 可以理解为 (类型说明符 *)变量名   其中, 这里的*只具有象征意义,仅表示这是一个指针变量 ,变量名即为定义的指针变量的名称

c语言之指针

ε祈祈猫儿з 提交于 2020-02-26 02:58:35
指针就是用来存放地址。 &(取地址) 表示取出这个变量的地址符号, *(解引用) 指针说明符号,取地址里面的值 。 指针理解: int A=12;int *p=&A;把12存在变量 A空间 的 地址上 。把A的空间里面地址存在p指针上。 指针格式:指针虽然指针存放地址,但是也有类型。 int a = 5; int * p = &a; #include<stdio.h> #include<windows.h> int main() { int a = 5; int* p = &a; printf("这是指针的值:%d\n",*p); printf("这是指针的地址:%p\n", p); return 0; } 指针基础 数组和指针的关系;一维数组的数组名就是一个指针。 #include<stdio.h> #include<windows.h> int main() { int array[5] = { 1,2,3,4,5 }; int* p = array; for (int i = 0; i < 5;i++) { printf("直接使用指针作为数组名:%d\n",p[i]); } system("pause"); return 0; } 指针数组关系 悬空指针: 使用完之后(一般就是free释放空间之后)没有及时赋值为NULL的指针就是悬空指针。 野指针:

C++细节注意点

痴心易碎 提交于 2020-02-25 15:44:44
文章目录 实现和声明的分离 不使用 using namespace std; C++对C语言的增强 重点1 引用 引用的注意事项 引用的本质 指针引用 常量型引用 成员函数调用const修饰对象实例 构造和析构函数实例 拷贝构造函数 拷贝构造函数的调用时机 深拷贝浅拷贝 深拷贝 初始化列表 类对象作为类成员的案例 explicit 关键字 new动态对象创建 完美代替malloc 静态成员变量 静态成员函数 单例模式 成员变量和成员属性分开处理 this指针 this指针的使用 空指针访问成员的函数 常函数和常对象 全局函数做友元函数 整个类做友元类 让成员函数做友元函数 自定义数组实例 运算符重载 二元重载 左移右移的重载的注意点 属性私有后 要使用友元来进行重载 前置后置递增运算符 指针运算符重载(自定义一个智能指针) 赋值运算符重载 [] 运算符的重载 关系运算符重载 函数调用运算符重载 不要重载||和&& 自定义string类 继承 继承方式 继承中的对象模型 继承中的构造和析构顺序 继承中同名成员的处理 继承中静态成员的处理 多继承 菱形继承 解决二义性的方法 虚继承工作原理 多态 静态编联和动态编联 多态原理解析 多态案例1 计算器 抽象类和纯虚基类 虚析构和纯虚析构函数 向上类型转换向下类型转换 游戏多态实例 模板 排序实例 普通函数和函数模板的区别 模板机制内部原理

文件操作

眉间皱痕 提交于 2020-02-24 23:01:24
一.文件的打开与关闭  1.定义文件指针的一般形式:FILE *指针变量标识符  2.C语言中有三个特殊的文件指针无需定义、打开可直接使用:    stdin:标准输入,默认为当前终端(键盘)      我们使用的scanf、getchar、函数默认从此终端获得数据    stdout:标准输出,默认为当前终端(屏幕)      我们使用的printf、puts函数默认输出信息到此终端    stderr:标准出错,默认为当前终端(屏幕)      当我们程序出错或使用perror函数时信息打印在此终端  3.打开文件    FILE *fp = NULL;    fp = fopen(文件名,文件打开方式);    • 文件名:要操作的文件的名字,可以包含路径信息     • 文件打开方式:"读"、"写"、"文本"、"二进制"等    • fp文件指针:指向被打开的文件,失败返回空,成功返回相应指针    例如:FILE *fp = NULL;       fp = fopen("test.txt","r");       if(fp == NULL)        printf("File open error\n");  4.文件打开的几种方式:读写权限:r  w  a  +   r:以只读方式打开文件     文件不存在,返回NULL     文件存在,返回文件指针

【整理】句柄.内核对象

人走茶凉 提交于 2020-02-24 05:53:08
  句柄是一个标识符,是拿来标识对象或者项目的。应用程序几乎总是通过调用一个WINDOWS函数来获得一个句柄,之后其他的WINDOWS函数就可以使用该句柄,以引用相应的对象。如果想更透彻一点地认识句柄,我可以告诉大家,句柄是一种指向指针的指针。我们知道,所谓指针是一种内存地址。应用程序启动后,组成这个程序的各对象是驻留在内存中的。 C#中的IntPtr类型称为“平台特定的整数类型”,它们用于本机资源,如窗口句柄。 资源的大小取决于使用的硬件和操作系统,但其大小总是足以包含系统的指针(因此也可以包含资源的名称)。 内核对象    内核对象只是内核分配的一个内存块,并且只能由该内核访问。该内存块是一种数据结构,它的成员负责维护该对象的各种信息。 有些数据成员(如安全性描述符、使用计数等)在所有对象类型中是相同的,但大多数数据成员属于特定的对象类型。例如,进程对象有一个进程 I D 、一个基本优先级和一个退出代码,而文件对象则拥有一个字节位移、一个共享模式和一个打开模式。    内核对象的数据结构只能被内核访问,因此应用程序无法在内存中找到这些数据结构并直接改变它们的内容 。 Microsoft 规定了这个限制条件,目的是为了确保内核对象结构保持状态的一致。这个限制也使 Microsoft 能够在不破坏任何应用程序的情况下在这些结构中添加、 删除和修改数据成员。 内核对象包括 如下

C++内存管理转自http://soft.yesky.com/lesson/110/2381610.shtml

拈花ヽ惹草 提交于 2020-02-23 15:04:50
转自 http://soft.yesky.com/lesson/110/2381610.shtml 踏入C++中的雷区——C++内存管理详解 2006-04-25 09:22 作者:蒋涛 出处:计算机教学网 责任编辑:方舟   伟大的Bill Gates 曾经失言:   640K ought to be enough for everybody — Bill Gates 1981   程序员们经常编写内存管理程序,往往提心吊胆。如果不想触雷,唯一的解决办法就是发现所有潜伏的地雷并且排除它们,躲是躲不了的。本文的内容比一般教科书的要深入得多,读者需细心阅读,做到真正地通晓内存管理。    1、内存分配方式   内存分配方式有三种:   (1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。   (2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。   (3) 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。    2

c语言进阶6-指针

我与影子孤独终老i 提交于 2020-02-22 02:43:27
指针是c语言的一个重要组成部分 是c语言的核心、精髓所在,用好指针可以在c语言编程中起到事半功倍的效果。一方面,可以提高程序的编译效率和执行速度以及实现动态的存储分配;另一方面,使用指针可使程序更灵活,全球表示各种数据结构,编写高质量的程序。 指针是c语言显著的优点之一,其使用起来十分灵活而且能提高某些程序的效率,但是如果使用不当则很容易造成系统错误。许多程序“挂死“往往都是由于错误地使用指针造成的 一、 地址与指针 系统的内存就好比是带有编号的小房间,如果想使用内存就需要得到房间编号。图1定义了一个整型变量i,整型变量需要4个字节,所以编译器为变量i分配的编号为1000~1003. 什么是地址? 地址就是内存区中对每个字节的编号 ,如图1所示的1000/1001/1002和1003就是地址,为了进一步说明来看图2. 内存地址 内容 1000 0 变量i 1004 1 变量j 1008 2 1012 3 1016 4 1020 5 图2所示的1000、1004等就是内存单元的地址,而0、1就是内存单元的内容,换种说法就是基本整型变量i在内存中的地址从1000开始。因为基本整型占4个字节,所以变量j在内存中的起始地址为1004,变量i的内容是0. 那么指针又是什么呢?这里仅将 指针看作是内存中的一个地址,多数情况下,这个地址就是内存中另一个变量的位置,如图3所示。

C++里的四种强制类型转换

时光毁灭记忆、已成空白 提交于 2020-02-21 07:12:51
C语言里将类型符号作为强制类型转换运算符的做法在C++中得到了兼容,但是C++中引入了四种功能不同的强制类型转换运算符:static_cast、reinterpret_cast、const_cast、dynamic_cast 1.为什么要新增四种强制类型转换? 强制类型转换具有一定风险,如:把整型转换为指针类型、将基类指针转换为派生类指针、将一种函数指针转换为另一种函数指针,将常量指针转换为非常量指针等。C++新引用四种强制类型转换主要是为了规避这种风险: a. 将int转换为double是没有风险的,而将常量指针转换为非常量指针,将int转换为指针类型都是高风险的,C中并未对这两种情况作区分 b. 将多态的基类指针转换为派生类指针时并不检查安全性,无法判断转换后的指针是否指向一个派生类对象 c. 如果强制类型转换出错,很难排查出错误 2.C++中强制类型转换运算符的用法 强制类型转换运算符<要转换的类型>(待转换的表达式) 如:double num = static_cast (1+2); // 将1+2转换为浮点类型 3.static_cast static_cast主要用于“低风险”的类型转换,如 整数、浮点数和字符类型 的转换,如果对象 重载了强制类型转换运算符 T(T是int、char或其他类型),则static_cast也可以用于将对象转换为T类型;而像整型和指针这种

delphi 函数指针

半城伤御伤魂 提交于 2020-02-19 17:36:52
Pascal 中的过程类型与C语言中的函数指针相似 ,为了统一说法,以下称函数指针。函数指针的声明只需要参数列表;如果是函数,再加个返回值。下面讲解指向非对象(一般的)函数/过程的函数指针。 例如声明一个过程类型,该类型带一个通过引用传递的整型参数: type IntProc = procedure (var Num: Integer); // IntProc是指向过程的函数指针 这个过程类型与任何参数完全相同的例程兼容,即用它声明的变量,可以指向任何此类函数,并通过其进行函数的调用。 下面是一个兼容例程: procedure DoubleTheValue (var Value: Integer); begin Value := Value * 2; end; 函数指针能用于两种不同的目的:声明函数指针类型的变量;或者把函数指针作为参数传递给另一例程。利用上面给定的类型和过程声明,你可以写出下面的代码: var IP: IntProc; X: Integer; begin IP := DoubleTheValue; X := 5; IP (X); end; 虽然这种调用方法比直接调用麻烦了,那么我们为什么要用这种方式呢? (1)因为在某些情况下,调用什么样的函数需要在实际中(运行时)决定,你可以根据条件来判断,实现用同一个表达,调用不同的函数,很是灵活. (2

2020/2/18-C语言复习-字符串与指针

无人久伴 提交于 2020-02-18 21:27:03
C语言复习-字符串与指针 例一: 【字符串处理 去除C代码中的注释】      C/C++代码中有两种注释,/* */和//。编译器编译预处理时会先移除注释。就是把/*和*/之间的部分去掉,把//以及之后的部分删掉。这里约定,如果出现了/* AAAA /* BBBB */的情况,也就是/**/中出现了/*,那么第二个/*是不当作注释起始的。编写函数void removeComment(char *str)。    分析:对于字符串”int c=4,/*c累计量*/ a=3;/*变量*/ // a初值为3 ”先用 strstr函数 在str中确认”/*” 是否出现过,是则再确认”*/” 是否出现过,是则 把str中自”*/”出现位置后2个字符起始的字符串复制到str中”/*”开始的位置,覆盖掉注释部分。 循环查找直到找不到”/*”为止;再用strstr在str中确认”//” 是否出现过,是则 把出现”//”的位置上置为’\0’ 。 #include <stdio.h> #include <string.h> void removeComment(char *str) { char *p=str, *q; while ((p=strstr(p, "/*")) != NULL) { q=strstr(p, "*/"); if (q != NULL) strcpy(p, q+2); } p