指针变量

C语言 指针

泄露秘密 提交于 2020-01-05 10:30:34
指针 : 地址 的代名词 , 在32位系统中,指针就4个字节; 指针变量 : 存放指针这个概念的盒子 指针每次读取的数据大小,取决于定义指针的数据类型;(int *p ; char *p) #include "stdio.h" int a=0x213432; int *p1; void main() { p1=&a; printf("%x\n",*p1); }结果:213432 int a=0x213432; char *p1; void main() { p1=&a; printf("%x\n",*p1); }编译会出现警告warning: assignment from incompatible pointer type, 结果为32.    指针+修饰符 const 常量,只读【不能变】 char *p; const char *p; p可以指向任意空间,但不希望改变其中的内容(与char const *p相同 ) char * const p : p一旦被赋值,将永远指向这个地址,但内容可以改变(与 char *p const相同 ) 硬件资源 const char * const p : ROM volatile 防止优化指向内存地址 volatile char *p typedef 别名 指针+运算符 加减运算 指针的加法/减法运算,实际上是增加一个单位

vector容器的用法

强颜欢笑 提交于 2020-01-05 05:28:00
转自一篇博客^-^: 1 基本操作 (1)头文件#include<vector>. (2)创建vector对象,vector<int> vec; (3)尾部插入数字:vec.push_back(a); (4)使用下标访问元素,cout<<vec[0]<<endl;记住下标是从0开始的。 (5)使用迭代器访问元素. vector<int>::iterator it; for(it=vec.begin();it!=vec.end();it++) cout<<*it<<endl; (6)插入元素: vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a; (7)删除元素: vec.erase(vec.begin()+2);删除第3个元素 vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始 (8)向量大小:vec.size(); (9)清空:vec.clear(); 2 vector的元素不仅仅可以使int,double,string,还可以是结构体,但是要注意:结构体要定义为全局的,否则会出错。下面是一段简短的程序代码: #include<stdio.h> #include<algorithm> #include<vector> #include<iostream> using namespace

深入理解JS函数中this指针的指向

与世无争的帅哥 提交于 2020-01-05 05:11:02
https://www.cnblogs.com/zjjDaily/p/9482958.html原文链接 函数在执行时,会在函数体内部自动生成一个this指针。谁 直接调用 产生这个this指针的函数,this就指向谁。 怎么理解指向呢,我认为指向就是等于。例如直接在js中输入下面的等式: console.log(this===window);//true 情况不同,this指向的对象也不同。例如: 1. 函数声明的情况 var bj=10; function add(){ var bj=20; console.log(this);//window console.log(this.bj);//10 console.log(bj);//20 console.log(this.bj+bj);//30 } add(); window.add(); (1) 执行了add()之后,此时的this指向的是window对象,为什么呢?因为这时候add是全局函数,是通过window 直接调用 的。所以下面我专门写了个window.add()就是为了说明,全局函数的this都是指向的window。 (2) 就像alert()自带的警告弹窗一样,window.alert()执行之后也是一样的效果。所以只要是 window点 这种调用方式都可以省略掉,因此警告弹窗可以直接使用alert()。 2.

野指针?空指针?

浪子不回头ぞ 提交于 2020-01-05 04:44:56
野 指针指的是指向不可用内存的指针。任何指针变量在被创建时,不会自动成为NULL指针(空指针),其缺省值是随机的,所以,指针变量在创建的同时应当被初始化,或者将指针设置为NULL,或者让它指向合法的内存,而不应该放之不理,否则就会成为野指针 。 而同时由于指针被释放(free或delete)后,未能将其设置为为NULL,也会导致该指针变为野指针。虽然free和delete把指针所指的内存给释放掉了,但它们并没有把指针本身干掉 ,一般可以采用语句if (p != NULL)进行防错处理,但是if语句却起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。第三种造成野指针的原因是指针操作超越了变量的作用范围。 例如如下程序示例。 #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char *p = (char *) malloc(100); strcpy(p, "hello"); free(p); if(p != NULL) printf("Not NULL\n"); return 0; } 输出: Not Null 上例中,虽然对p执行了free操作 , p 所指的内存被释放掉了,但是p所指的地址仍然不变,在后续的判断p是否为NULL时,根本没有起到防错的作用

C语言-----野指针

ε祈祈猫儿з 提交于 2020-01-05 04:39:28
问题所在 1、 局部指针变量没有被初始化 2、 使用已经释放过后的指针 3、 指针所指向的变量在指针之前被销毁 4、 结构体成员指针未初始化, 没有为结构体指针分配足够的内存 ,内存越界(考虑使用柔性数组)和 泄露 避免规则 1、用 malloc 申请了内存之后,应该立即检查指针值是否为 NULL ,防止使用值为 NULL 的指针 2、牢记数组的长度,防止数组越界操作,考虑使用柔性数组 3、动态申请操作必须和释放操作匹配,防止内存泄露和多次释放 4、 free 指针之后必须立即赋值为 NULL malloc用于从堆中分配一块指定大小的内存,以void *的类型返回这块内存的起始地址。malloc的参数就是要分配的内存的大小,以字节为单位。 所以如果要分配1个整型空间就需要malloc(sizeof(int)),由于返回的void *不能直接赋值给int *,所以还要进行一次强制类型转换int * s=(int*)malloc(sizeof(int)); struct Student { char* name; int number; }; int main() { struct Student s; strcpy(s.name, "gggg"); // OOPS! ////////////////////////////////////野指针,,不能随便赋值,因为s是一个局部变量

C语言野指针

坚强是说给别人听的谎言 提交于 2020-01-05 04:37:06
指针是C语言一个很强大的功能。然而所谓成也萧何,败也萧何,用好了指针会使程序大放异彩,用错了指针轻者只是报个错,重者可能整个系统都崩溃了。本篇我们来谈谈指针一种错误的使用方法”野指针“。 野指针一般是指定义时没有给初值的指针变量。来看以下程序: #include <stdio.h> #include <string.h> int main() { char *source1 = "abc"; char *source2; printf("source2的值是:%u\n", source2); strcpy(source2 , source1); printf("%s",source2); return 0; } 这段程序定义了一个指向字符的指针 source2,但是没有给它一个初始值。下面的代码就是将字符串”abc“复制到source2中,编译的结果如下: --------------------Configuration: Test - Win32 Debug-------------------- Compiling... demo.c D:\CCode\Test\demo.c(8) : warning C4700: local variable 'source2' used without having been initialized Linking... Test.exe

成员指针

爱⌒轻易说出口 提交于 2020-01-05 04:26:17
C++中,成员指针是最为复杂的语法结构。但在事件驱动和多线程应用中被广泛用于调用回叫函数。在多线程应用中,每个线程都通过指向成员函数的指针来调用该函数。在这样的应用中,如果不用成员指针,编程是非常困难的。   刚遇到这种语法时也许会让你止步不前。但你会发现,使用恰当的类型定义之后,复杂的语法是可以简化的。本文引导你了解成员函数指针的声明,赋值和调用回叫函数。    成员函数指针的声明   一个成员函数指针包括成员函数的返回类型,后随::操作符类名,指针名和函数的参数。初看上去,语法有点复杂。其实可以把它理解为一个指向原函数的指针,格式是:函数返回类型,类名,::操作符,指针星号,指针名,函数参数。   一个指向外部函数的指针声明为:   void (*pf)(char *, const char *);   void strcpy(char * dest, const char * source);   pf=strcpy;   一个指向类A成员函数的指针声明为:   void (A::*pmf)(char *, const char *);   声明的解释是:pmf是一个指向A成员函数的指针,返回无类型值,函数带有二个参数,参数的类型分别是char * 和 const char *。除了在星号前增加A:: ,与声明外部函数指针的方法一样。    赋值  

C++对象指针—指向对象成员的指针

心已入冬 提交于 2020-01-05 04:25:06
对象有地址,存放对象初始地址的指针变量就是指向对象的指针变量。对象中的成员也有地址,存放对象成员地址的指针变量就是指向对象成员的指针变量。 1、指向对象数据成员的指针定义指向对象数据成员的指针变量的方法和定义指向普通变量的指针变量方法相同。 例如 int *p1; //定义指向整型数据的指针变量 定义指向对象数据成员的指针变量的一般形式为数据类型名 *指针变量名;如果Time类的数据成员hour为公用的整型数据,则可以在类外通过指向对象数据成员的指针变量访问对象数据成员hour。 p1=&t1.hour;//将对象t1的数据成员hour的地址赋给p1,p1指向t1.hour cout<<*p1<<endl;//输出t1.hour的值 2、指向对象成员函数的指针需要提醒读者注意: 定义指向对象成员函数的指针变量的方法和定义指向普通函数的指针变量方法有所不同。 成员函数与普通函数有一个最根本的区别: 它是类中的一个成员。编译系统要求在上面的赋值语句中,指针变量的类型必须与赋值号右侧函数的类型相匹配,要求在以下3方面都要匹配: ①函数参数的类型和参数个数; ②函数返回值的类型; ③所属的类。 定义指向成员函数的指针变量应该采用下面的形式: void (Time::*p2)( );//定义p2为指向Time类中公用成员函数的指针变量 定义指向公用成员函数的指针变量的一般形式为 数据类型名

C++ 基础知识复习(二)

▼魔方 西西 提交于 2020-01-05 04:24:21
异常处理部分: 23. 在c++的异常处理中,除了提供异常的关键字语法支持以外,其标准库中支持异常处理而封装异常类也很好的为应用程序中异常处理判断使用提供直接的帮助。C++语言中针对异常处理提供了三个关键字,分别为try、throw与catch。C++应用程序中通过这三个关键字实现机制组合来实现异常的处理。try体中可以直接抛出异常,或者在try体中调用的函数体中间接的抛出。注意catch是接thorw出来的数据的,数据类型上要兼容。 预处理及内存管理部分: 24. C语言提供的预处理功能有哪些: 答:宏定义,文件包含和条件编译。 25. include的使用方式: 答:include 如果包含的文件名在尖括号内,则为标准头文件,会在预定义的位置集进行查找。位置集可有环境变量或命令行修改。引号中为自定义头文件,查找始于源文件所在路径,一层层找直到系统文件目录。 26. 如何申请以及释放空间: 答:int *p; p=new int; *p=100; delete p; 注意如果要对这一内存地址进行操作,需要使用*号。 27. 什么是虚函数和纯虚函数: 答:虚函数用来建立抽象模型,从而达到方便系统扩展的目的,纯虚函数是指标明不具体实现的虚函数,是一种特别的虚函数。虚函数必须是基类定义的非静态函数,可以是protected活着public的。在一个类中,虚函数后面加上=0

c++复习笔记(3)

前提是你 提交于 2020-01-05 04:23:35
这篇是各种琐碎的东西。 类的函数如果在类内部直接实现,则成为内联函数候选。类外部实现的方法,可以用inline声明,使其称为内联函数候选。但是函数是否可以成为内联函数,需要看编译器的行为。、 构造函数可以使用初始列: functionName (varList) : var1(value1), var2(value2) {} 构造函数可以放在private区(单例)。 类的成员函数可以分为改变类的值的和不改变类的值的。不改变类的值的函数可以加const: returnType functionName (varList) const {} 这里注意,这么写的原因,有一个是:当我们声明了一个const的实例,然后调用不是const的方法就会出错。所以对不改变值的函数,加上const,就可以被const实例正常调用。 函数的参数传递和返回值,首先考虑引用。若参数不需要变化时,要传const引用。 标记friend的方法可以访问class的private部分,注意友元函数并不是类的一部分,仅仅是需要在类中进行声明。相同class的objects互为friends。 对于返回值,如果返回的是传入的指针或引用,则可以返回引用。如果返回的是函数内新建的变量,就不能返回引用(因为函数结束之后,新建的变量的生命周期就结束了,此时返回引用就会发生错误)。 所有的成员函数都默认有一个参数this