指针数组

双指针

此生再无相见时 提交于 2019-11-29 21:17:18
数组简介 数组 是一种基本的数据结构,用于按顺序 存储元素的集合 。但是元素可以随机存取,因为数组中的每个元素都可以通过数组 索引 来识别。 数组可以有一个或多个维度。这里我们从 一维数组 开始,它也被称为线性数组。这里有一个例子: 在上面的例子中,数组 A 中有 6 个元素。也就是说,A 的长度是 6 。我们可以使用 A[0] 来表示数组中的第一个元素。因此,A[0] = 6 。类似地,A[1] = 3,A[2] = 8,依此类推。 寻找数组的中心索引 给定一个整数类型的数组 nums,请编写一个能够返回数组“中心索引”的方法。 我们是这样定义数组中心索引的:数组中心索引的左侧所有元素相加的和等于右侧所有元素相加的和。 如果数组不存在中心索引,那么我们应该返回 -1。如果数组有多个中心索引,那么我们应该返回最靠近左边的那一个。 示例 1: 输入: nums = [1, 7, 3, 6, 5, 6] 输出: 3 解释: 索引3 (nums[3] = 6) 的左侧数之和(1 + 7 + 3 = 11),与右侧数之和(5 + 6 = 11)相等。 同时, 3 也是第一个符合要求的中心索引。 示例 2: 输入: nums = [1, 2, 3] 输出: -1 解释: 数组中不存在满足此条件的中心索引。 说明: nums 的长度范围为 [0, 10000]。 任何一个 nums[i]

秋招C++开发学习之路day3

a 夏天 提交于 2019-11-29 20:49:26
day3(list、string、str.copy、vector、reserve、resize、static、数组和指针区别) 0. list是双向链表实现的,所以也是一段不连续的内存存储。 string类的底层是一个字符串指针。对字符串的操作和字符数组的操作是不一样的。C++字符串转换成C字符数组,常用的data()、c_str()、copy();最好不用C指针来存放转换,如:const char * cstr=str . c_str(); 改变str会改变cstr的值。所以考虑复制的形式,把转换后的从c_str中复制出来然后赋值给C字符串。 strncpy(str1,str2,int n)把str2的n个字符复制到str1; str.copy(p,n,m)表示至少复制n个数据到p所指向的空间,从m个字符开始。 string::npos 表示机器的最大正整数,64 位18446744073709551615 ,32 位4294967295 强制转换成int之后就是 -1 ,m没有值则默认为0,也就是第一个字符开始。 int snprintf(a,n,格式,…),例如:int i = snprintf(a , 9 ,” %012d ”, 12345) ; print(“i=%d,a=%s”,i,a),结果是 12 00000001;%012d就是按int类型12为输出

C语言的零碎 (三)

China☆狼群 提交于 2019-11-29 19:15:43
main函数的标准原型应该是 int main(int argc, char *argv[]); 。 argc 是命令行参数的个数。而 argv 是一个指向指针的指针,为什么不是指针数组呢?因为前面讲过,函数原型中的 [] 表示指针而不表示数组,等价于 char **argv 。那为什么要写成 char *argv[] 而不写成 char **argv 呢?这样写给读代码的人提供了有用信息, argv 不是指向单个指针,而是指向一个指针数组的首元素 。数组中每个元素都是 char * 指针,指向一个命令行参数字符串。 指向非const变量的指针或者非const变量的地址可以传给指向const变量的指针,编译器可以做隐式类型转换,例如 char c = 'a'; const char *pc = &c; 但是,指向const变量的指针或者const变量的地址不可以传给指向非const变量的指针,以免透过后者意外改写了前者所指向的内存单元,例如对下面的代码编译器会报警告: const char c = 'a'; char *pc = &c; const int *a; int const *a; 这两种写法是一样的,a是一个指向const int型的指针,a所指向的内存单元不可改写,所以(*a)++是不允许的,但a可以改写,所以a++是允许的。 int * const a;

数组与指针、变量、字符数组、结构体及其他总结

╄→гoц情女王★ 提交于 2019-11-29 18:46:13
2019-07-18 一: 1. 软件模块划分:高内聚低耦合,提高模块独立性,即使用一个模块完成一项功能,耦合性越少越好。 2. 算法的性质:有穷性(有限操作步骤);确定性(含义唯一,步骤确定);有 0 个或多个输入;有一个或多个输出;有效性(步骤能有效执行)。 3. 同一文件中的所有函数都能引用全局变量的值。形式参数是局部变量。在函数外定义的变量是全局变量,在函数内定义的变量是局部变量。 二: 1. 程序的局部变量存在于 栈 中,全局变量存在于 静态区 中,动态申请数据存在于 堆 中。   内存中供用户使用的存储空间分为 3 部分:程序区;静态存储区;动态存储区。 静态存储区:全局变量(程序开始执行时给全局变量分配存储区,执行完毕后释放 ,占据固定的存储单元);静态局部变量(只在编译时赋一次初值,只能被本函数引用);静态外部变量(函数外部静态变量);外部变量。栈区。 动态存储区:函数形式参数(调用函数时给形参分配存储空间);自动变量,即函数中的没有用 static 声明的变量;函数调用时的现场保护和返回地址等。当函数调用开始时分配动态存储空间,函数结束时释放这些空间。栈区。 存储类别:自动( auto ,默认,动态存储区)、静态( static ,静态存储区)、寄存器( register , CPU 寄存器中)、外部( extern ,静态存储区)。 内存动态分配区域:随时开辟

c++面试题中经常被面试官面试的小问题总结(二)(本篇偏向指针知识)

Deadly 提交于 2019-11-29 18:45:55
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/10713204.html 1.利用指针交换两个字符串方法?(这题是我当年读大一的时候看到的,好怀念!!!QAQ) (一)指针引用 #include<iostream> using namespace std; void swap(char *&a,char *&b) { char *temp; temp = a; a = b; b = temp; } int main() { char *ap = "hello"; char *bp = "word"; swap(ap,bp); cout<<"ap:"<<ap<<endl; cout<<"bp:"<<bp<<endl; return 0; } (二)二维指针指向一维 #include<iostream> using namespace std; void swap(char **a,char **b) { char *temp; temp = *a; *a = *b; *b = temp; } int main() { char *ap = "hello"; char *bp = "word"; swap(&ap,&bp); cout<<"ap:"<<ap<<endl; cout<<"bp:"<<bp<<endl; return

数组指针和指针数组的区别

戏子无情 提交于 2019-11-29 18:45:35
数组指针(也称行指针) 定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。 如要将二维数组赋给一指针,应这样赋值: int a[3][4]; int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。 p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0] p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][] 所以数组指针也称指向一维数组的指针,亦称行指针。 指针数组 定义 int *p[n]; []优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1时,则p指向下一个数组元素,这样赋值是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。 如要将二维数组赋给一指针数组: int *p[3]; int a[3][4]; p++; //该语句表示p数组指向下一个数组元素。注:此数组每一个元素都是一个指针 for(i=0;i<3;i++) p[i]=a

数组指针和指针数组的区别

我只是一个虾纸丫 提交于 2019-11-29 18:45:27
数组指针(也称行指针) 定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。 如要将二维数组赋给一指针,应这样赋值: int a[3][4]; int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。 p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0] p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][] 所以数组指针也称指向一维数组的指针,亦称行指针。 指针数组 定义 int *p[n]; []优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1时,则p指向下一个数组元素,这样赋值是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。 如要将二维数组赋给一指针数组: int *p[3]; int a[3][4]; p++; //该语句表示p数组指向下一个数组元素。注:此数组每一个元素都是一个指针 for(i=0;i<3;i++) p[i]=a

数组指针和指针数组的区别(1)

℡╲_俬逩灬. 提交于 2019-11-29 18:45:14
一、指针数组和数组指针的内存布局 初学者总是分不出指针数组与数组指针的区别。其实很好理解: 指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定。它是“储存指针的数组”的简称。 数组指针:首先它是一个指针,它指向一个数组。在32 位系统下永远是占4 个字节,至于它指向的数组占多少字节,不知道。它是“指向数组的指针”的简称。 下面到底哪个是数组指针,哪个是指针数组呢: A) int *p1[10]; B) int (*p2)[10]; 每次上课问这个问题,总有弄不清楚的。这里需要明白一个符号之间的优先级问题。 “[]”的优先级比“*”要高。p1 先与“[]”结合,构成一个数组的定义,数组名为p1,int *修饰的是数组的内容,即数组的每个元素。那现在我们清楚,这是一个数组,其包含10 个指向int 类型数据的指针,即指针数组。至于p2 就更好理解了,在这里“()”的优先级比“[]”高,“*”号和p2 构成一个指针的定义,指针变量名为p2,int 修饰的是数组的内容,即数组的每个元素。数组在这里并没有名字,是个匿名数组。那现在我们清楚p2 是一个指针,它指向一个包含10 个int 类型数据的数组,即数组指针。我们可以借助下面的图加深理解: 二、int (*)[10] p2-----也许应该这么定义数组指针 这里有个有意思的话题值得探讨一下

数组,指针,函数

橙三吉。 提交于 2019-11-29 17:37:33
  学c语言就知道数组、指针在c中有着特殊的地位。而且是必须掌握的一项知识,学会它会让你受益无穷。   一、数组   1、数组:室友一系列相同元素构成的。它连续的存储在内存中。   2、数组的声明:     格式: 类型 数组名 [元素个数];     例 : int myarray[10];     注意:在c99之前不允许出现元素个数为变量的情况。     例:       int n = 10;       int myarray[n]; // C99之前不允许(这种声明方式不允许被初始化)   3、数组的初始化:     int myarray[] = {1,2,3,4,5}; // 正确,这种情况下元素个数可以省略。     int myarray [10] = {1,2,3,4,5,6,7,8,9,0}; // 一般情况,元素和元素中间用 “,”分割     int myarray [10] = {1,2,3}; // 只初始化前三个元素。   int myarray [10] = {[4] = 4,[6] = 6}; //第5个元素个第6个员被初始化,其他元素都为0。 int n = 10; int myarray [n] = {1,2,3,4,5,6,7,8,9,0}; //错误 。C99之后允许变量作为数组的元素个数,但是不允许初始化这种声明。    

数组指针和指针数组,行指针列指针

爷,独闯天下 提交于 2019-11-29 16:42:44
首先,需要理解一下 数组指针 和 指针数组 这两个名词: “数组指针”和“指针数组”,只要在名词中间加上“的”这个字,就知道中心了 数组的指针: 是一个指针 , 指向数组的指针 。 指针的数组: 是一个数组 , 装着指针的数组 。 还有一件事需要牢记: 优先级:()> [ ] > * (*p)[n]:根据优先级,先看括号内,则p是一个指针,这个指针指向一个一维数组,数组长度为n, 这是“数组的指针”,即数组指针; *p[n]:根据优先级,先看[],则p是一个数组,再结合*,这个数组的元素是指针类型,共n个元素, 这是“指针的数组”,即指针数组。 根据上面两个分析,可以看出,p是什么,则词组的中心词就是什么,即数组“指针”和指针“数组”。 综上所诉: (*p)[n]:数组指针:是指针——指向数组的指针。 *p[n]:指针数组:是数组——装着指针的数组。 数组指针是一个指针变量,占有内存中一个指针的存储空间; 指针数组是多个指针变量,以数组的形式存储在内存中,占有多个指针的存储空间。 接下来讲解行指针与列指针: 这两种特殊的指针是针对C语言中的二维数组来说的。 二维数组,可以理解为数组的数组 所以对于一个数组: int a [ 2 ] [ 3 ] = { 1 , 2 , 3 , 4 , 5 , 6 } ; 他相当于:数组成员为一维数组的一维数组,这就是二维数组 int a [ 2 ]