指针变量

简单讲述我对指针和结构体的一些理解

时光总嘲笑我的痴心妄想 提交于 2020-02-27 03:05:49
大家可以写几行代码好好想想这些东西。编译出来看就很好理解了。 指针概述 指针在C语言可以理解为一个对象,利用地址,她的值直接向存在电脑内存储存器中的另一个地方的值。可以说,地址指向该单元变量,所以将地址形象化的称为“指针”。我们可以理解为指针是个变量,存放内存单元的地址。指针是一个存放地址的变量。 指针的大小在32位平台是四个字节,在64位平台是八个字节。 指针类型 指针一般存放什么类型的变量,指针就定义为什么类型。 eg: int* char* flaot* /等等都可以定义指针变量 指针类型的意义就在于当指针±整数时,决定指针向前或者向后走一步的距离有多大(地址的变化) 指针类型也同样决定了,对指针解引用的时候有多大的权限(可以操作几个字符).char* /的指针解引用只可以访问一个字节,而int* /的指针的解引用就可以访问四个字节。 野指针 野指针可以理解为错误的使用指针。使指针指向的位置是不可知的。 规避野指针出现的方法:指针初始化;小心指针越界;指针指向空间释放即使置NULL;指针使用之前检查其有效性。 指针与数组 int arr[10] = {1,2,3,4,5,6,7,8,9,10}; int* p = arr; 数组名表示的是数组首元素的地址。 可以直接通过指针来访问数组。 二级指针 int a = 10; int *pa = &a; int **ppa =

C++笔记(3):一些C++的基础知识点

99封情书 提交于 2020-02-26 23:05:08
前言: 找工作需要,最近看了下一些C++的基本概念,为范磊的 《零起点学通C++》,以下是一些笔记。 内容:   delete p;只是删除指针p指向内存区,并不是删除指针p,所以p还是可以用的。删除空指针所指向内存是可以的。   堆中的变量和对象时匿名的,没有名称,只能通过指针来访问。   在堆中创建对象时,在分配内存的同时会调用类的构造函数,在删除堆中对象时,会调用类的析构函数。   为了避免内存泄露,在删除一个指针后应该将其其值赋为0。   常量指针是指针指向的内存区域地址不能改变,但是该内存地址里保存的值是可以改变的,比如int a; int * const p = &a;   指向常量的指针表示指针指向的对象是不能被修改的,但是该指针可以被修改,即该指针可以指向另一块目标内存地址。比如const int a = 0; const int *p = &a; 如果A是一个类,也可以为const A* p = new A;   而指向常量的常指针表示指针本身不能被修改,其指向的内存地址内容也不能被修改。比如const int a = 0; const int * const p = &a;   引用就是别名常量。   堆中的地址是用指针来操作的,用不到别名。   如果在main函数前面的其它函数的声明和定义是一起的,则表明这个函数是内联函数!因此当该函数较长时

Typedef函数指针?

守給你的承諾、 提交于 2020-02-26 22:57:02
我正在学习如何动态加载DLL,但我不明白的是这一行 typedef void (*FunctionFunc)(); 我有几个问题。 如果有人能够回答他们,我将不胜感激。 为什么要使用 typedef ? 语法看起来很奇怪; 在 void 之后,应该没有函数名称或其他名称吗? 它看起来像一个匿名函数。 是否创建了函数指针来存储函数的内存地址? 所以我现在很困惑; 你能为我澄清一下吗? #1楼 #include <stdio.h> #include <math.h> /* To define a new type name with typedef, follow these steps: 1. Write the statement as if a variable of the desired type were being declared. 2. Where the name of the declared variable would normally appear, substitute the new type name. 3. In front of everything, place the keyword typedef. */ // typedef a primitive data type typedef double distance; // typedef

C语言指针变量的定义和使用

时间秒杀一切 提交于 2020-02-26 16:33:46
指针变量的含义 数据在内存中的地址也称为指针,如果一个变量存储了一份数据的指针,我们就称它为指针变量 。 在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。指针变量的值就是某份数据的地址,这样的一份数据可以是数组、字符串、函数,也可以是另外的一个普通变量或指针变量。 定义指针变量 定义指针变量与定义普通变量非常类似,不过要在变量名前面加星号*,格式为: datatype * name ; 或者 datatype * name = value ; *表示这是一个指针变量,datatype表示该指针变量所指向的数据的类型 。例如: int * p1 ; p1 是一个指向 int 类型数据的指针变量,至于 p1 究竟指向哪一份数据,应该由赋予它的值决定。再如: int a = 100 ; int * p_a = & a ; 在定义指针变量 p_a 的同时对它进行初始化,并将变量 a 的地址赋予它,此时 p_a 就指向了 a。值得注意的是,p_a 需要的一个地址,a 前面必须要加取地址符&,否则是不对的。 指针变量也可以被多次写入,只要你想,随时都能够改变指针变量的值,请看下面的代码: //定义普通变量 float a = 99.5 , b = 10.6 ; char c = '@' , d = '#' ; //定义指针变量 float * p1 = & a ; char *

C++变量和基本类型知识概要总结

烂漫一生 提交于 2020-02-26 15:38:40
整合基本的关于c++的变量和基本类型的知识。参考于C++primer第二章 仅包含部分,而非全部 inti=b; //i的值为1 i= 3.14; //i的值为3 double pi = i; // pi的值为3.0 unsigned char C = - 1; //假设char占8比特,c的值为255 signed char c2 = 256; //假设char占8比特,c2的值是未定义的 注意:当我们赋给无符号类型一个超过它表示范围的值时,结果就是初始值对无符号类型所表示的数值总值取模后的余数。 举个清新易懂的例子 例如:八比特大小的unsigned char 可以表示0至255区间内的值,如果赋了一个区间以外的值,则实际值就是该值对256取模后所得的余数。-1赋值给unsigned char的结果时255. 但是 !!赋值给有符号类型超过它表示范围的值时,结果就是未定义的。程序可能继续工作,可能崩溃,也可能产生垃圾数据。 int类型的加了一个无符号值时,int会先变成无符号类型然后再操作。 若两个无符号相减后变成负数了,结果会是取模后的值 ‘A’ 和 "A"是有区别的,'A’就是一个单独的字符A,而"A"则代表了一个字符的数组,包含两个字符,一个是字母A ,另一个是空字符。 对于C++程序员来说,变量和对象一般可以互换使用 初始化不是赋值

引用与指针的区别

萝らか妹 提交于 2020-02-26 13:42:03
目录 1 引用的概念 2 指针的概念 3 定义引用 4 引用和指针的区别 1 引用的概念 引用就是变量的别名,对引用的操作等价于对变量的操作,不会给引用分内存空间,引用和被引用的变量共享一块内存空间。 一个变量可以有多个引用,一个引用只能对应一个变量(一个引用不能是多个变量的别名)。 2 指针的概念 指针是“指向”另外一种类型的符合类型。指针可以实现对对象的间接访问。 3 定义引用 数据类型 &引用名 = 变量名; 注意: 1)在定义引用的时候一定要初始化 2)一个引用只能是一个变量的别名,不能是多个变量的别名 &什么时候是取地址,什么时候是引用? &前有数据类型就是引用, &前没有数据类型就是取地址 4 引用和指针的区别 区别如下: 1)指针占4个字节内存空间,引用不占内存,引用的和被引用的变量共用同一块内存空间 2)指针可以改向,引用一旦初始化完成,不能变成别的变量的引用 3)指针可以不初始化,引用一定要初始化 4)指针的运算只是移动一个数据类型的地址,引用的运算就是变量的运算 5)可以有void*型指针,不能有void型的引用 6)有数组指针,函数指针,不能有数组引用,和函数引用 7)常引用可以是常量的别名,指针只能是字符串常量的地址,不能定义成其他常量的地址。 8)可以定义多级指针,但不能这样定义: 数据类型 && 引用名 = 变量名; 引用也可以有别名

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-26 02:40:48
1. char* x;这样的一定是野指针,指针声明时要直接初始化!或者置null也行! 2. 1 int main() 2 { 3 char *x=new char; 4 delete x; 5 cout<<*x; 6 getchar(); 7 return 0; 8 } delete x;之后,x就是一个野指针。 1 int main() 2 { 3 char *x=new char[10]; 4 cout<<*x; 5 strcpy(x,"dqwdqw"); 6 delete []x; 7 cout<<x; 8 getchar(); 9 return 0; 10 } 这段代码是能运行的,但delete[]x;之后,x就成为了一个野指针,输出的结果是未定义的。这里我们应该加上: x=nullptr; 或者malloc之后free掉的指针,也是上面的情况,一定要把指针置null。 3. 函数参数为二级指针&p,将p指向了函数中的临时变量。函数调用完毕后,p这个指针就变为了野指针。 1 int f(char** x){ 2 char p=97; //'a' 3 *x=&p; 4 } 5 int main() 6 { 7 char a=65; //'A' 8 char *x=&a; 9 f(&x); 10 cout<<*x; 11 getchar(); 12 return 0; 13

C++细节注意点

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