指针变量

C++指针小结

走远了吗. 提交于 2020-03-08 19:25:19
/*--> */ /*--> */ 一、指针基本概念 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。学习指针必须了解如下四个内容: 1 指针的类型:去掉标识符,指针的类型对于机器而言都是一样的 2 指针指向的类型:去掉标识符和左边的 * 3 指针的值:一个 32 位的数值(一般是内存地址) 4 指针指向的内存区域:指针的值代表指针指向内存区域的首地址,指针指向的类型决定了该内存区域的大小。指针的移位操作和指针指向的类型有关动,指针一次移动一个 sizeof (指针指向的类型)大小。      (1)int*ptr =0;// 指针的类型是 int* 指针所指向的类型是 int ,指针的值为 0 (非法地址)表示指针未指向合法内存。    (2)int**ptr;// 指针的类型是 int** 指针所指向的的类型是 int*    (3)int(*ptr)[3];// 指针的类型是 int(*)[3] 指针所指向的的类型是 int()[3]    (4)int*(*ptr)[4];// 指针的类型是 int*(*)[4] 指针所指向的的类型是 int*()[4] 二、指针相关的运算: 1& :取地址运算符,返回结果是一个指针(地址值都可以转换为指针), &a 的运算结果是一个指针,指针的类型是 a 的类型加个 * ,指针所指向的类型是 a 的类型,指针所指向的地址

C指针小结

落爺英雄遲暮 提交于 2020-03-08 19:24:57
在C语言的学习中,指针,数组,函数等被我们所熟知,但是真正碰到或者真正用到时,难免有些混淆。下面重点聊一下指针: 指针:通俗讲是内存单元的地址,是个常量。换句话说是地址。 指针变量:在C语言中允许一个变量来存放指针,这个变量就是指针变量。是个变量。换句话说是取值为地址的变量。(但是在平时大家统称指针变量为指针,这个要分清) 指针变量的类型说明: 类型说明符* 变量名;初始化的两种方法:int* p = &a或者int* p;p = &a;( 指针定义时要初始化,这是一个好习惯) 指针变量的运算: (1) 取地址运算符&:单目运算,从右—>左,功能:取变量的地址;          (2)取内容运算符*:单目运算,从右—>左,功能:用来表示指针变量所指的变量。(在类型说明中的*是类型说明符) 接下来,就来点绕口的数组指针,指针数组,函数指针,指针函数的区别: (1)数组指针:全称是数组指针变量,指向数组的指针变量成为数组指针变量,是个变量。一般类型:类型说明符* 指针名 (2)指针数组:是一组有序的指针的集合。一般类型:类型说明符*数组名[数组长度]。这与二维数组指针变量的形式相同但是表示的意义不同。 (3)函数指针:全称函数指针变量,一个函数总是占用一段连续的内存区,而函数名就是该内存的首地址,把这个地址赋给一个变量就是函数指针变量。 一般形式:类型说明符(*指针变量名)();

33-指针的运算

房东的猫 提交于 2020-03-08 19:24:44
   只有指向同一数组的两个指针变量之间才能进行运算,否则运算毫无意义。 1、两指针变量相减   两指针变量相减所得之差是两个指针所指数组元素之间相差的元素个数。   实际上是两个指针值(地址)相减之差再除以该数组元素的长度(字节数)。   (pointer2地址值 -pointer地址值) / sizeof(所指向数据类型) 2、两指针变量进行关系运算 指向同一数组的两指针变量进行关系运算可表示它们所指数组元素之间的关系。 例如: • p == p1 表示 p 和 p 1 指向同一数组元素 • p > p1 表示 p 处于高地址位置 • p < p1 表示 p 处于低地址位置。 指针变量还可以与0比较。 设p为指针变量,则 p==0表明p是空指针,它不指向任何变量; p!=0表示p不是空指针。 注意:指针可以相减,但是不能相加(相加没有意义)。 空指针是由对指针变量赋予0值而得到的。 来源: https://www.cnblogs.com/xdl745464047/p/4004286.html

DS博客作业02--线性表

好久不见. 提交于 2020-03-08 19:05:04
0.PTA得分截图 1.本周学习总结 1.1 总结线性表内容 1.顺序表结构体定义、顺序表插入、删除的代码操作 顺序表的定义: 线性表的顺序存储又称为顺序表。 它用一组地址连续的存储单元,依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。 第 1 个元素存储在线性表的起始位置,第 i 个元素的存储位置后面紧接着存储的是第 i+1 个元素。 因此,顺序表的特点是表中元素的逻辑顺序与其物理顺序相同。 顺序表结构体的定义:typedef int ElemType即是定义数据元素类型,可以适应更多类型; typedef struct的内容就是定义了定义顺序表类型,只是定义了一个类型,而不是变量; 顺序表结构的定义,对于在代码的后续操作起着关键性作用,所以在结构体的定义中要仔细。 顺序表插入、删除的代码操作:顺序表的插入和删除操作,在顺序表开始寻找到相对性的数值, 就开始执行操作。删除操作针对于区间删除来说,先从第一个for循环开始执行,定义三个变量, 找到重复元素就开始删除操作。顺序表的插入删除都是要遍历链表,找到相对应的元素进行操作。 2.链表结构体定义、头插法、尾插法、链表插入、删除操作 链表结构体的定义:对于单链表而言,先定义的一个结构体用来描述单链表的结点。从这个结构 定义中,我们知道,结点由存放数据元素的数据域存放后继结点地址的指针域组成

ios学习记录 day10

微笑、不失礼 提交于 2020-03-08 15:03:46
1.指针 直接访问 //a = 20 间接访问 //通过地址访问内存内容 2.& 取地址 * 取内容 & 和 *配套使用 他俩正好相反 3.内存 栈区 从高向低分配 | 堆区 从低向高分配 1)、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其 操作方式类似于数据结构中的栈。 2)、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回 收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 3)、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的 全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另 一块区域。 - 程序结束后由系统释放。 4)、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放 5)、程序代码区—存放函数体的二进制代码。 int a = 5; int b = 3; int c = 2; printf("%p\n%p\n%p\n",&a,&b,&c); 打印:0x7fff5fbff8b c 0x7fff5fbff8b 8 0x7fff5fbff8b 4 4.指针定义 类型 变量名 = 初值 int * p = NULL; //int * 是类型 NULL恒等于0 int a = 5; int * p = NULL;

29、指针,及其运算(注意点)

。_饼干妹妹 提交于 2020-03-08 13:48:48
指针可以进行加法,减法,及比较大小的运算。 1、指针加、减一个整形表达式 pointer+/-n:是pointer地址值+/-n×sizeof(*pointer),即地址值实际增加或减少的字节数为n倍对象类型长度。 2、两个对象类型相同的指针进行减法运算 p-q=n:运算结果对象类型是一个整数,表示两个地址值相差的对象类型长度的倍数。 3、指针比较大小,就是比较地址值的高低。 4、首地址:当数据对象的存储长度超过一个字节时,系统自动使用第一个内存单元的地址来表示对象的存储地址,称为首地址。 5、指针常量:NULL,数组名,函数名 6、初始化: int a[4],*p; p=NULL; p=a+1; double (*f)(double)=sin; 7、安全使用指针: 用已有变量或数组元素作指针对象 用malloc和free分配和释放 void *malloc(n); free(void *p); 8、指针与数组在大多数情况下可以相互替换,但是并不等价。数组名对应起始地址,在生命周期内不可改变,但数组内容可以改变;而指针变量是一个变量。注意下面一个例子: #include "iostream" using namespace std; int main() { char* p1="world"; //指针指向常量字符串 p1[0]='X'; //p1指向常量,该语句试图修改常量

Effective C++ 学习笔记

别等时光非礼了梦想. 提交于 2020-03-08 13:46:07
1. 基础部分 Item 1: View C++ as a federation of languages. 对于内建类型,按值传递优于按引用传递,对于自定义类型则相反。 C++可视为4中子语言的联合:C,Object-Oriented C++,Template C++和STL。 Item 2: Prefer consts, enums, and inlines to #defines. 只有整型常量可以在类声明里面初始化: class Klass { const static int num = 1 ; //也可只声明,在定义文件中,即类外部定义、初始化; }; enum类型也可以在类内部初始化。 Item 3: Use const whenever possible. 对于指针p,const在 * 左边时,p指向的值为常量,const出现在 * 右边时,p指向的地址为常量。 const int * p1 ; int const * p2 ; int * const p3 ; ​ //以上代码,p1和p2一样,其指向的值为常量;p3指向的地址为常量 如果类Klass有同名的两个成员函数foo,其中一个为const类型,那么const实列优先调用const版的foo。 const函数不能改变非static的成员变量。 mutable修饰的成员,在const函数中也可以改变其值。

信息的表示和处理(一)信息存储

依然范特西╮ 提交于 2020-03-08 11:42:38
信息存储 大多数计算机使用8位的块,或者字节(byte),作为最小的可寻址的内存单位,而不是访问内存中单独的位。机器级程序将内存视为一个非常大的字节数组,称为虚拟内存。内存的每个字节都由一个唯一的数字来标识,称为它的地址,所有可能地址的集合就称为虚拟地址空间。顾名思义,这个虚拟地址空间只是一个展现给机器级程序的概念性映像。实际的实现是将动态随机访问存储器(DRAM)、闪存、磁盘存储器、特殊硬件和操作系统软件结合起来,为程序提供一个看上去统一的字节数组。 十六进制表示法 一个字节由八位组成。在二进制表示法中,它的值域是0000 0000 2 ~1111 1111 2 。如果看成十进制整数,它的值域就是0 10 ~255 10 。两种符号表示法对描述位模式来说都不是非常方便。二进制法太冗长,而十进制表示法与位模式转化很麻烦。代替的方法时,以16位基数,或者叫做十六进制数,来表示位模式。十六进制(简写为“hex”)使用数字0~9以及字符A~F来表示十六个可能的值。图1-1展示了十六个十进制数字对应的十进制值和二进制值。用十六进制书写,一个字节的值域为00 16 ~FF 16 。 图1-1 十六进制法。每个十六进制数字都对十六个值中的一个进行了编码 在C语言中,以0x或0X开头的数字常量被认为是十六进制的值。字符A~F既可以大写也可以小写,甚至可以大小写混合。比如FA1D37B 16

C++标准转换运算符reinterpret_cast

*爱你&永不变心* 提交于 2020-03-08 08:34:51
C++标准转换运算符reinterpret_cast 来源 https://www.cnblogs.com/codingmengmeng/p/7650885.html reinterpret_cast<new_type> (expression) reinterpret_cast运算符是用来处理无关类型之间的转换;它会产生一个新的值,这个值会有与原始参数(expression)有完全相同的比特位。 什么是无关类型?我没有弄清楚,没有找到好的文档来说明类型之间到底都有些什么关系(除了类的继承以外)。后半句倒是看出了reinterpret_cast的字面意思:重新解释(类型的比特位)。我们真的可以随意将一个类型值的比特位交给另一个类型作为它的值吗?其实不然。 IBM的C++指南里倒是明确告诉了我们reinterpret_cast可以,或者说应该在什么地方用来转换运算符: 从指针类型到一个足够大的整数类型 从整数类型或者枚举类型到指针类型 从一个指向函数的指针到另一个不同类型的指向函数的指针 从一个指向对象的指针到另一个不同类型的指向对象的指针 从一个指向类函数成员的指针到另一个指向不同类型的函数成员的指针 从一个指向类数据成员的指针到另一个指向不同类型的数据成员的指针 不过我在Xcode中测试了一下,事实上reinterpret_cast的使用并不局限在上边所说的几项的

C++面试题

时光怂恿深爱的人放手 提交于 2020-03-08 08:06:32
语言基础类 1. 指针和引用的区别? (1)指针有自己的一块空间,而引用只是一个别名;  (2)使用 sizeof 看一个指针的大小为 4 字节(32位,如果要是64位的话指针为8字节),而引用则是被引用对象的大小。 (3) 引用必须在定义时被初始化,指针不必; (4)不存在指向空值的引用,但存在指向空值的指针。 2.static和 const的用法,(能说出越多越好)(重点) 首先说说const的用法(绝对不能说是常数) 1.限定变量为不可修改。 2.限定成员函数不可以修改任何数据成员。 3.使用const关键字修饰的变量,一定要对变量进行初始化 下面的声明都是什么意思? const int a; a是一个常整型数 int const a; a是一个常整型数 const int *a; a是一个指向常整型数的指针,整型数是不可修改的,但指针可以 int * const a; a为指向整型数的常指针,指针指向的整型数可以修改,但指针是不可修改的 int const * a const; a是一个指向常整型数的常指针,指针指向的整型数是不可修改的,同时指针也是不可修改的 通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。 合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。