指针数组

指针(二)

倖福魔咒の 提交于 2020-01-29 22:16:12
指针与数组 指向数组的指针 数组是内存中一块连续的区域,存储着相同类型的数据,在声明一个数组时,会开辟两个空间,一个用于保存数组元素,一个用来保存数组的第一个元素的地址,数组名就是用于保存数组第一个元素地址的指针。 指向一位数组的指针 int a1 [ 100 ] ; int n ; n = * a1 ; //n 为数组a1第一个元素的值 n = * ( a1 + 5 ) ; // 数组a1的第6个元素 尽管指针与数组之间有密切的关系,但是指针类型变量是可以不断进行赋值,在程序运行过程中可以发成变化,数组名虽然是指针,但是是一种指针类型的常量,只能指向固定的内存地址,不能将一个指针值赋值给一个数组名,同时在程序运行的过程中是不能发生改变。 指向多维数组的指针 例如:二维数组相当于一个二维表格,二维数组具有首地址,行首地址,元素地址等,数组名代表首地址,称为二维数组的指针,行首地址是二维数组中某一行的首地址,每行相当于一个一维数组,元素地址是二维地址中具体的分量。 int a [ 4 ] [ 5 ] ; // a代表整个二维数组的首地址,*a代表是第0行首地址,a[0]代表第i行的首地址 指向字符串的指针 char * str1 = "string1" ; 指针数组与指向指针的指针 指针数组 数组元素均为指针类型数据的数组。指针数组中的每个元素都相当于一个指针变量。 int * p

C:指针基础

夙愿已清 提交于 2020-01-29 01:18:03
内存概述 内存 内存含义: 存储器:计算机的组成中,用来存储程序和数据,辅助CPU进行运算处理的重要部分。 内存:内部存贮器,暂存程序/数据——掉电丢失 SRAM、DRAM、DDR、DDR2、DDR3。 外存:外部存储器,长时间保存程序/数据—掉电不丢ROM、ERRROM、FLASH(NAND、NOR)、硬盘、光盘。 内存是沟通CPU与硬盘的桥梁: 暂存放CPU中的运算数据 暂存与硬盘等外部存储器交换的数据 物理存储器和存储地址空间 有关内存的两个概念:物理存储器和存储地址空间。 物理存储器:实际存在的具体存储器芯片。 主板上装插的内存条 显示卡上的显示RAM芯片 各种适配卡上的RAM芯片和ROM芯片 存储地址空间:对存储器编码的范围。我们在软件上常说的内存是指这一层含义。 编码:对每个物理存储单元(一个字节)分配一个号码 寻址:可以根据分配的号码找到相应的存储单元,完成数据的读写 内存地址 将内存抽象成一个很大的一维字符数组。 编码就是对内存的每一个字节分配一个32位或64位的编号(与32位或者64位处理器相关)。 这个内存编号我们称之为内存地址。 内存中的每一个数据都会分配相应的地址: char:占一个字节分配一个地址 int: 占四个字节分配四个地址 float、struct、函数、数组等 指针基础 指针和指针变量 内存区的每一个字节都有一个编号,这就是“地址”。

C++ primer 笔记(一)

。_饼干妹妹 提交于 2020-01-28 08:22:47
第1章 >> << 输入输出操作符返回 输出流std::cin, std::cout本身 endl输出换行,刷新与设备关联的buffer augument 实参 paremeter 形参 buit-in type 内置类型 manipulator 操纵符 第2章 C++是静态类型语言,编译时执行类型检查 wchar_t =L'a' 16位 float 6位有效数字 double 至少10位有效数字 long double 至少10位有效数字 赋值:对于unsigned越界赋值,结果等于该值对unsigned可能取值个数求模 例如:unsigned char c=336; //实际c=336%256=80 unsigned char c=-1; //实际c=-1%256=255 对于signed越界赋值,由编译器决定实际值 初始化不是赋值,初始化指创建变量并赋值,赋值是擦出当前值赋新值 内置类型初始化:在函数体外定义的变量初始化为0,函数体内定义的不自动初始化。 定义:分配存储空间,还可以指定初值 声明:向程序表明变量的类型,名字 extern声明:当有初始化式时则为定义 非const变量默认为extern,要使const变量能在其他文件中访问,则需显式指定为extern。const默认为定义它的文件的局部变量。 引用必须在定义时初始化,引用一经初始化,就始终指向同一个特定对象。

学习JDK1.8集合源码之--ArrayDeque

谁说我不能喝 提交于 2020-01-26 11:14:52
1. ArrayDeque简介   ArrayDeque是基于数组实现的一种双端队列,既可以当成普通的队列用(先进先出),也可以当成栈来用(后进先出),故ArrayDeque完全可以代替Stack,ArrayDeque是非线程安全的,Stack是线程安全的。   ArrayDeque虽然是基于数组实现的,但很容易被数组这种数据结构所迷惑。因为数组是从0开始到length-1位置结束的,但ArrayDeque的实现实际上是一种循环结构的队列,首尾位置完全靠head和tail两个首尾指针来决定的,正常理解的情况下head的值应该比tail小,但是这里会出现head比tail大的情况。所以这里我们不能以正常数组的角度去看待,我可以把这个数组看成一个环形结构的首尾相连的结构,即数组最后一位的下一位就是第一位(不要习惯性把0当成头部,length-1当成尾部),数据都存储在head右边及tail的左边,不知道有没有说清楚~~   除此之外,ArrayDeque对队列的容量有特殊的要求,必须是2^n(这里和HashMap类似),由于2^31超出int的最大值,故ArrayDeque的最大容量为2^30。ArrayDeque不允许存储null值,原因是需要通过取出的元素是否为null来判断队列是否为空。   关于更多关于ArrayDeque的讲解,这篇文章讲的很好: 【源】ArrayDeque

C++数组、指针、引用

限于喜欢 提交于 2020-01-26 10:48:41
1 int &arr[10]; //arr为引用的数组 2 int (&arr)[10]; //arr为具有10个整数的整型数组的引用 3 4 int *arr[10]; //arr为指针的数组 5 int (*arr)[10]; //arr为具有10个整数的整型数组的指针 来源: https://www.cnblogs.com/safety/p/12233774.html

C++基础内容复习

陌路散爱 提交于 2020-01-26 09:50:31
下列语句定义了5个变量: int count; double sales_price,sum; std::string title; Sales_item bookItem; 每个定义都是以 类型说明符 开始,如上int、double、std::string、Sales_item都是类型名,其中int和doubleshi是 内置类型 ,std::string是 标准库定义的类型 (需要#include <string>), Sales_item是 自定义类型 。 ::作用域操作符,含义是右操作符的名字可以在左操作数的作用域中找到 简化std::string 的写法是使用using。 比如使用using std::string; using std:cin;之后,在下面的代码中就可以直接使用string和cin了。 当进行string对象和字符串字面量混合连接操作时,+操作符的左右操作数必须至少有一个是string类型的。 比如,如下s1的初始化时正确的 string item ="what a mess!"; string s1 =item +","; 但是:string s1 ="what a mess!" +","; 就会报错,这个和C#是 完全不一样 的。 虽然任何整数数值都可以作为索引,但是索引的实际数据类型却是unsigned类型的string::size_type

Nginx学习笔记 ---高级数据结构

寵の児 提交于 2020-01-26 03:15:31
动态数组 ngx_array_t 表示一块连续的内存,其中存放着数组元素,概念上和原始数组很接近 // 定义在 core/ngx_array.h typedef struct { void * elts ; // 数组的内存位置,即数组首地址 ngx_uint_t nelts ; // 数组当前的元素数量 size_t size ; // 数组元素的大小 ngx_uint_t nalloc ; // 数组可容纳的最多元素容量 ngx_pool_t * pool ; // 数组可使用的内存池 } ngx_array_t ; elts 就是原始的数组,定义成 void*,使用时应强转成相应的类型 nelts 相当于 vector.size(); size 相当于 sizeof(T); nalloc 相当于 vector.capacity(); pool 数组使用的内存池,相当于 vector 的 allocator 数组里的元素不断增加,当 nelts > nalloc 时将引起数组扩容,ngx_array_t 会向内存池 pool 申请一块两倍原大小的空间————这个策略和 std::vector 是一样的 但 ngx_array_t 扩容成本太高,它需要重新分配内存并且将数据拷贝,所以最好一次性分配足够的空间,避免动态扩容 操作函数: 使用 ngx_array_t.elts

char s []和char * s有什么区别?

风流意气都作罢 提交于 2020-01-25 19:57:48
在C语言中,可以在这样的声明中使用字符串文字: char s[] = "hello"; 或像这样: char *s = "hello"; 那么区别是什么呢? 我想知道在编译和运行时在存储持续时间方面实际发生了什么。 #1楼 只需添加:它们的大小也会得到不同的值。 printf("sizeof s[] = %zu\n", sizeof(s)); //6 printf("sizeof *s = %zu\n", sizeof(s)); //4 or 8 如上所述,对于数组 '\\0' 将分配为最后一个元素。 #2楼 区别在于 char *s = "Hello world"; 将放置 "Hello world" 在内存的只读部分 ,使 s 的指针,使得在这个内存非法任何写入操作。 这样做时: char s[] = "Hello world"; 将文字字符串放入只读内存中,并将该字符串复制到堆栈上新分配的内存中。 因此 s[0] = 'J'; 法律。 #3楼 char s[] = "hello"; 声明 s 为 char 数组,该数组足以容纳初始化程序(5 + 1 char s),并通过将给定字符串文字的成员复制到数组中来初始化该数组。 char *s = "hello"; 声明 s 到是指向一个或多个(更在这种情况下) char S和点直接在包含文字固定(只读)位置 "hello" 。

数组与链表

时光毁灭记忆、已成空白 提交于 2020-01-25 12:11:29
引子 假设你去看演出,需要将东西寄存。寄存处有一个柜子,柜子有很多抽屉。 计算机就像是很多抽屉的集合体,每个抽屉都有地址。 fe0ffeeb是一个内存单元的地址。 需要将数据存储到内存时,你请求计算机提供存储空间,计算机给你一个存储地址。需要存储多项数据时,有两种基本方式——数组和链表。但它们并非都适用于所有的情形,因此知道它们的差别很重要。接下来介绍数组和链表以及它们的优缺点。 数组 有时候,需要在内存中存储一系列元素。假设你要编写一个管理待办事项的应用程序,为此需要将这些待办事项存储在内存中。 我们先将待办事项存储在数组中。 使用数组意味着所有待办事项在内存中都是相连的 (紧靠在一起的)。 现在假设你要添加第四个待办事项,但后面的那个抽屉放着别人的东西! 这就像你与朋友去看电影,找到地方就坐后又来了一位朋友,但原来坐的地方没有空位置,只得再找一个可坐下所有人的地方。在这种情况下,你需要请求计算机重新分配一块可容纳4个待办事项的内存,再将所有待办事项都移到那里。如果又来了一位朋友,而当前坐的地方也没有空位,你们就得再次转移!真是太麻烦了。同样,在数组中添加新元素也可能很麻烦。如果没有了空间,就得移到内存的其他地方,因此添加新元素的速度会很慢。 再以整型数组为例,数组的存储形式如下图所示。正如军队里的士兵存在编号一样,数组中的每一个元素也有着自己的下标,只不过这个下标从0开始

C++函数指针总结

巧了我就是萌 提交于 2020-01-24 07:05:14
  学习c++的过程中,指针是难点,熟悉了指针之后,还有一个让人很蛋疼的难点,那就是函数指针了。本博文详细介绍一下常见的各种坑爹的函数指针。   至于指针的详细学习,推荐这篇博文 C++指针详解   与数据一样,函数也有地址,函数的地址就是内存中存放函数语言代码的起始地址。函数指针就是指向这个地址。函数指针所指向的类型,就是函数本身。我们知道,指针所指向类型代表了指针所指向的内存区域的大小。所以函数指针所指向的类型,就是函数在内存中所占据内存的大小。知道了函数的起始地址和大小,所以函数指针可以很轻易的代替函数完成函数调用。 一、最简单的函数指针   变量都包括声明和赋值,指针不例外,函数指针也不例外。我们来看一个简单的函数: void add(int a, int b){ cout << a + b << endl; }   一个简单的加法计算并输出到命令行的函数。   那么如何通过函数指针来调用它呢?   1、声明: void (*p1)(int a, int b);   函数指针的声明很简单,基本就是通过一个指针把函数名替换。指针p1的类型为void (*) (int a,int b),表明指针是一个指向某个函数的指针,指针指向的类型为void () (int a,int b)   2、赋值: p1 = add;   3、也可以直接定义: void (*p1)(int a,