指针数组

C语言指针与数组

亡梦爱人 提交于 2020-01-04 05:49:02
C语言指针与数组 数组的下标应该从0还是1开始? 我提议的妥协方案是0.5,可惜他们未予认真考虑便一口回绝 -- Stan Kelly-Bootle 1. 数组并非指针 为什么很多人会认为指针和数组始终应该可以互换的呢? 因为对数组的引用总是可以写成对指针的引用,而且确实存在一种指针和数组的定义完全相同的上下文环境, 不幸的是,这只是数组的一种极为普通的用法,并非所用情况下都是如此。 2. 什么是声明,什么是定义 C语言中对象必须有且只有一个定义,但它可以有多个extern声明. 定义:只能出现在一个地方, 确定对象的类型并分配内存 ,用于创建新的对象,例如 int a[100] 声明:可以多次出现,描述对象的类型,用于指代其他地方定义的对象(例如在其他文件里) 例如 extern int a[100] extern对象声明告诉编译器对象的类型和名字,对象的内存分配则在别处进行 3. 数组与指针的区别 出现在赋值左边的符号被称为 左值, 出现在赋值右边的符号被称为 右值。 编译器为每个变量分配一个地址(左值),这个地址在编译时可知,并且该变量在运行时一直保存于这个地址中。 存储于变量中的值(右值)只有在运行时才可知,如果需要用到变量中存储的值,编译器就发出指令从指定地址读入变量并将它存于寄存器中。 例如: char a[9] = "abcdefgh"; c = a[i]

数组、字符串和指针

会有一股神秘感。 提交于 2020-01-04 05:48:46
1.如何使用数组   数组就是一组名为数组元素或简称元素的内存位置,各个内存位置可以存储相同数据类型的数据项,而我们可以用相同的变量名引用所有内存位置。 2.如何声明和初始化不同类型的数组   声明数组:例如 long height[6];   初始化数组:例如 int engine_size[5] = {200, 250, 300, 350, 400};   C++11标准定义了一种表示一组初始值的新的统一方式,对于用这种方式初始化的所有对象,这些初始值都是相同的,包括标准模板库容器和数组。   例如:int value[]{2,3,4}; 有了这种语法,=操作符就是不必要的。 3.如何对数组使用基于范围的for循环   例如: double temperatures[] = {65.5, 68.0, 75.0, 77.5, 76.4, 73.8, 80.1};       double sum = 0.0;       int count = 0;       for(double t : temperatures){         sum += t;         ++count;       }       double average = sum/count;   还可以使用auto关键字来编写该循环:     for(auto temperature :

指针和动态数组 new ,delete

╄→гoц情女王★ 提交于 2020-01-04 05:48:30
............心中要有一内存块,以便理解知识 计算机储存数据必须知道数据的3种属性: 1.存储在何处.......并起名 2.值 3.类型 (1)int a;a=30; (2)int *b=&a; (3).int *a,b;注意...整型....指针a,整型...变量b,对每个指针都要有一个*; .......................指针.......................................... 1.指针是一个变量,存储的是...值的地址,而不是值本身, 指针变量 是指向特定变量类型指针,和数组相似 ..int* tax;...............指向int变量的指针,又叫整型指针 ..double * str;.............指向double变量的指针 ..int 指针和double指针虽然指向的数据类型不同, 但这两个变量本身长度的通常是一样的,好比1016可能是超市的地址,也可能是,村庄的地址一样,.....地址的长度或值,不能指示该地址上有什么建筑物,也不指示有关变量的长度或类型的任何信息 .显示地址,cout常用16进制 .......................指针与c++原理.......................................... oop强调的是运行阶段进行决策; 如

指针知识(三):指针与数组

自作多情 提交于 2020-01-04 05:47:52
数组的概念与指针的概念联系非常解密。其实 数组的标识 相当于它的 第一个元素的地址 ,如:int a[5],数组名a指向它的第一个元素a[0]的地址。 有语句如下: int a[5]; int * p; 下面的赋值为合法的: p = a; 这里指针p 和a 是等价的,它们有相同的属性,唯一的不同是我们可以给指针p赋其它的数值,而a 总是指向被定义的5个整数组中的第一个。所以,p只是一个普通的指针变量,而与之不同,a 是一个指针常量(constant pointer),数组名的确是一个指针常量。因此虽然前面的赋值表达式是合法的,但下面的不是: a = p; 因为a 是一个数组(指针常量),常量标识不可以被赋其它数值。 由于变量的特性,以下例子中所有包含指针的表达式都是合法的: #include <iostream> using namespace std; int main() { int a[5]; int *p; p = a;      //p是a[0]的地址,因a指向a的首地址,即指向a[0], *p = 10;    //即a[0]=10 p++; *p = 20;   //a[1]=20 p = &a[2]; *p = 30;   //a[2]=30; p = a +3; *p = 40;    //a[3]=40 p = a; *(p+4) = 50; //a[4]=50

c++ 指针(一)

ぃ、小莉子 提交于 2020-01-04 05:45:39
指针 每一个变量都有一个内存位置 ,每一个内存位置都定义了可使用连字号( & )运算符访问的地址,它 表示了在内存中的一个地址 #include <iostream> using namespace std; int main () { int var1; char var2[10]; cout << "var1 变量的地址: "; cout << &var1 << endl; cout << "var2 变量的地址: "; cout << &var2 << endl; return 0; } 结果: var1 变量的地址: 0xbfebd5c0 var2 变量的地址: 0xbfebd5b6 一、定义 指针是一个变量,其值为另一个变量的地址 ,即, 内存位置的直接地址 。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。 type *var-name; 星号是用来指定一个变量是指针 int *ip; /* 一个整型的指针 */ double *dp; /* 一个 double 型的指针 */ float *fp; /* 一个浮点型的指针 */ char *ch; /* 一个字符型的指针 */ 所有 指针的值的实际数据类型 ,不管是整型、浮点型、字符型,还是其他的数据类型, 都是一样的,都是一个代表内存地址的长的十六进制数 。

C,C++——指针和数组

人走茶凉 提交于 2020-01-01 18:50:42
一 指针和一维数组的关系 指向数组的指针变量称为数组指针变量 数组名是数组首个元素的地址。 数组名可以看作是一个指针常量,不可修 改。 其值为首个元素的地址值。如下用指针变量访问数组元素 int a[]={12,22,32,42,52,62,72,82,92,102}; int *pa=a; //指针变量p指向数组a的首地址 。pa等价于a 用指针变量对数组元素的访问可以采用下标形式和指针形式两种 下标形式: p[i] 指针形式: *(p+i) 举例 for ( int i = 0 ; i < 5 ; i ++ ) { //使用数组方式 cout << p1 [ i ] << " " ; cout << b [ i ] << " " ; //使用指针运算符 cout << * ( p1 + i ) << " " ; cout << * ( b + 1 ) << " " ; } 二 指针和多维数组关系 C++允许把一个二维数组分解为多个一维数组来处理。数组名是首个元素 (一维数组)的地址。如下所示定义一个二维数组a int a [ 3 ] [ 4 ] = { { 11 , 12 , 13 , 14 } , { 21 , 32 , 23 , 24 } , { 31 , 32 , 33 , 34 } , } 二维数组a可以分解为一维数组a[0],a[1],a[2]。如下图所示 数组指针

旋转数组的最小数字

穿精又带淫゛_ 提交于 2020-01-01 02:59:22
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。 思路: 旋转之后的数组实际上可以划分成两个有序的子数组:前面子数组的大小都大于后面子数组中的元素 注意到实际上最小的元素就是两个子数组的分界线。本题目给出的数组一定程度上是排序的,因此我们试着用二分查找法寻找这个最小的元素。 思路: (1)我们用两个指针left,right分别指向数组的第一个元素和最后一个元素。按照题目的旋转的规则,第一个元素应该是大于最后一个元素的(没有重复的元素)。 但是如果不是旋转,第一个元素肯定小于最后一个元素。 (2)找到数组的中间元素。 中间元素大于第一个元素,则中间元素位于前面的递增子数组,此时最小元素位于中间元素的后面。我们可以让第一个指针left指向中间元素。 移动之后,第一个指针仍然位于前面的递增数组中。 中间元素小于第一个元素,则中间元素位于后面的递增子数组,此时最小元素位于中间元素的前面。我们可以让第二个指针right指向中间元素。 移动之后,第二个指针仍然位于后面的递增数组中。 这样可以缩小寻找的范围。 (3)按照以上思路

剑指offer-旋转数组的最小数字

泪湿孤枕 提交于 2020-01-01 02:55:24
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。   Step1. 和二分查找法一样,我们用两个指针分别指向数组的第一个元素和最后一个元素。   Step2. 接着我们可以找到数组中间的元素:     如果该中间元素位于 前面的 递增子数组, 那么它应该大于或者等于第一个指针指向的元素 。此时数组中最小的元素应该位于该中间元素的 后面 。我们 可以把第一个指针指向该中间元素,这样可以缩小寻找的范围 。移动之后的第一个指针仍然位于前面的递增子数组之中。     如果中间元素位于 后面的 递增子数组, 那么它应该小于或者等于第二个指针指向的元素 。此时该数组中最小的元素应该位于该中间元素的 前面 。   Step3. 接下来我们再用更新之后的两个指针,重复做新一轮的查找。 按照上述的思路,第一个指针总是指向前面递增数组的元素,而第二个指针总是指向后面递增数组的元素。最终第一个指针将指向前面子数组的最后一个元素,而第二个指针会指向后面子数组的第一个元素。也就是它们最终会指向两个相邻的元素,而第二个指针指向的刚好是最小的元素。这就是循环结束的条件。 以前面的数组{3

剑指offer6:旋转数组

大城市里の小女人 提交于 2020-01-01 02:53:21
题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。 思路:二分查找的一个变形 旋转之后的数组实际上可以划分成两个有序的子数组:前面子数组的大小都大于后面子数组中的元素 注意到实际上最小的元素就是两个子数组的分界线。本题目给出的数组一定程度上是排序的,因此我们试着用二分查找法寻找这个最小的元素。 思路: (1)我们用两个指针left,right分别指向数组的第一个元素和最后一个元素。按照题目的旋转的规则,第一个元素应该是大于最后一个元素的(没有重复的元素)。 但是如果不是旋转,第一个元素肯定小于最后一个元素。 (2)找到数组的中间元素。 中间元素大于第一个元素,则中间元素位于前面的递增子数组,此时最小元素位于中间元素的后面。我们可以让第一个指针left指向中间元素。 移动之后,第一个指针仍然位于前面的递增数组中。 中间元素小于第一个元素,则中间元素位于后面的递增子数组,此时最小元素位于中间元素的前面。我们可以让第二个指针right指向中间元素。 移动之后,第二个指针仍然位于后面的递增数组中。 这样可以缩小寻找的范围。 (3)按照以上思路

剑指 Offer——6. 旋转数组中的最小数字

让人想犯罪 __ 提交于 2020-01-01 02:51:53
题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的 一个旋转 ,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。 思路与实现 (1)我们用两个指针 left, right 分别指向数组的第一个元素和最后一个元素。按照题目的旋转的规则,第一个元素应该是大于最后一个元素的(没有重复的元素)。 但是如果不是旋转,第一个元素肯定小于最后一个元素。 (2)找到数组的中间元素。 中间元素大于第一个元素,则中间元素位于前面的递增子数组,此时最小元素位于中间元素的后面。我们可以让第一个指针left指向中间元素。 移动之后,第一个指针仍然位于前面的递增数组中。 中间元素小于第一个元素,则中间元素位于后面的递增子数组,此时最小元素位于中间元素的前面。我们可以让第二个指针right指向中间元素。 移动之后,第二个指针仍然位于后面的递增数组中。 这样查找范围就会一半一半的缩小。 (3)按照以上思路,第一个指针left总是指向前面递增数组的元素,第二个指针right总是指向后面递增的数组元素。 最终第一个指针将指向前面数组的最后一个元素,第二个指针指向后面数组中的第一个元素。 也就是说它们将指向两个相邻的元素