指针数组

数组名和指针的区别

匿名 (未验证) 提交于 2019-12-03 00:37:01
作者:SHI家的鱼 链接:https://www.zhihu.com/question/41805285/answer/202040382 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 1. 己址 数组和指针,都是有自己的地址的 。在代码中,你可以用取地址运算符“&”来取得。程序中是: printf("%x %x\n", &pInt, &arr); 2. 己值 数组和指针,都是有自己的数据值的 。程序中,数组arr的数据值,是arr[0]的地址;而对于指针pInt,通过 pInt = arr; 之后,pInt的数据值也是arr[0]的地址。 但是,有一点不一样的是,arr的数据值是不可以改变的,是个常量;而指针变量pInt的数据值,是可以改变的 ,你可以: pInt = arr; 你也可以: pInt = arr + 1; 随你! 另外,都可以在数组和指针的己值上,做运算 ,比如: arr + 1; pInt + 1; 3. 他值 数组和指针,在获取他值时,在代码的写法上是一样的 。比如对于数组,你想获取第2个元素的值,你可以这样写: arr[1];*(arr + 1); 对于指针pInt,你也可以这样写: pInt[1]; *(pInt + 1); 也可以在数组和指针的他值上做运算,比如: arr[0] + 1; *arr + 1; *(arr

C语言指针相关解析

匿名 (未验证) 提交于 2019-12-03 00:19:01
在C语言中除了一级指针和二级指针,还有一些比较常用但又比较拗口的指针类型。 比如:指针数组和数组指针。它们的名称只是前后顺序不一样,却有着千差万别,容我向大家徐徐道来。 先看两种定义:int *p[5], int(*p)[5]。 第一个是指针数组,由于"[ ]"的优先级高于“*”,所以p先和"[ ]"结合,构成了数组,后和"*"结合,成了指针数组。 指针数组依然是数组,只不过它里面存放的是指针。如图: 第二个是数组指针,在加了“()”后,p先与“*”结合,因此成为了数组指针。顾名思义,它是一个指针,指向p[4]数组 的首地址。 继续如图!: 函数指针:例如void(*fun1)( );函数指针是用来存放函数地址的变量,在函数中,函数的地址是入口地址,由函数名来表示。 函数指针比较好理解,因此不会赘言太多。 在函数指针的基础上,介绍一个定义: 函数指针数组,它是一个数组,用来存放一组函数的地址。 函数指针数组的一个简单应用:计算器 int (* p )[ 5 ]( int x , int y )={ 0 , add , sub , mul , div }; 其中int(*p)[5]()就是一个函数指针数组,这样调用函数时,特别方便,效率也高。 在函数指针数组的概念下,最后介绍一个顺口溜一般的类型: 函数指针数组的指针。它是一个指针,指向一个数组,数组里面存放函数的地址。 依次拆开

C语言之复杂指针简析

匿名 (未验证) 提交于 2019-12-03 00:18:01
指针数组 :首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定。它是“储存指针的数组”的简称。 数组指针 :首先它是一个指针,它指向一个数组。在 32 位系统下永远是占 4 个字节,至于它指向的数组占多少字节,不知道。它是“指向数组的指针”的简称。 那么下边俩个分别叫做什么呢? int *p1[4]; int (*p2)[4]; 第一个我们称之为指针数组。“[ ]”的优先级比“ ”要高。p1 先与“[ ]”结合,构成一个数组的定义,数组名为 p1,int 修饰的是数组的内容,即数组的每个元素。这是一个数组,其包含 4 个指向 int 类型数据的指针,即指针数组。 我们可以这样理解: 第二个我们称之为数组指针。在这里“()”的优先级比“ []”高,“*”号和 p2 构成一个指针的定义,指针变量名为 p2,int 修饰的是数组的内容,即数组的每个元素。数组在这里并没有名字,是个匿名数组。那现在我们清楚 p2 是一个指 针,它指向一个包含 10 个 int 类型数据的数组,即数组指针。 同样,也可以这样理解: 函数指针 :就是函数的指针。它是一个指针,指向一个函数。 函数指针数组 :它是一个数组,数组内存储了指向函数的指针。 函数指针数组指针 :它是一个指针,只不过这个指针指向一个数组,这个数组里面存的都是指向函数的指针。 看如下例子: char * ( pf)

向量vector 容器浅析

坚强是说给别人听的谎言 提交于 2019-12-03 00:17:54
一、什么是vector? 向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。 二、容器特性 1.顺序序列 顺序容器中的元素按照严格的线性顺序排序。可以通过元素在序列中的位置访问对应的元素。 2.动态数组 支持对序列中的任意元素进行快速直接访问,甚至可以通过指针算述进行该操作。操供了在序列末尾相对快速地添加/删除元素的操作。 3.能够感知内存分配器的(Allocator-aware) 容器使用一个内存分配器对象来动态地处理它的存储需求。 三、基本函数实现 1.构造函数 vector():创建一个空vector vector(int nSize):创建一个vector,元素个数为nSize vector(int nSize,const t& t):创建一个vector,元素个数为nSize,且值均为t vector(const vector&):复制构造函数 vector(begin,end):复制[begin,end)区间内另一个数组的元素到vector中 2.增加函数 void push_back(const T& x):向量尾部增加一个元素X iterator insert(iterator it,const T& x)

数组指针操作函数

匿名 (未验证) 提交于 2019-12-03 00:09:02
函数 作用 reset 将数组的内部指针指向第一个单元 end 将数组的内部指针指向最后一个单元 prev 将数组的内部指针倒回一位 next 将数组中的内部指针向前移动一位 each 返回数组中当前的键/值对并将数组指针向前移动一步 current 返回数组中的当前单元 来源:51CTO 作者: Karagrade 链接:https://blog.csdn.net/coco1118/article/details/101061881

C++传值和传引用

匿名 (未验证) 提交于 2019-12-03 00:08:02
首先你肯定明白一个道理:当初始化一个非引用类型的变量时,初始值被拷贝给变量,此时对变量的改动不会涌向初始值 int n = 0 ; int i = 1 ; // i是n的副本 i = 42 ; // i的值改变,n的值不改变 传值参数的机理完全一样,由于 每次调用函数时都会重新创建它的形参,并用传入的实参对形参进行初始化 ,所以 函数对形参做的所有操作不会影响实参 ,如果我们想让函数改变我们传入的实参本身们就可以用到 指针形参 访问函数外部对象 先看一段代码: int n = 0 ; int i = 1 ; int * p1 = & n ; //p1指向n int * p2 = & i ; //p2指向i * p1 = 42 ; //n的值改变,p1不变 p1 = p2 //现在p1指向了i,但是i和n的值都不变 当执行指针拷贝操作时,拷贝的是指针的值(地址),拷贝之后,两个指针是不同的指针,因为指针可以使我们间接地访问所指向的对象,所以通过指针可以修改对象的值 指针形参也差不都 // 接受一个int类型的指针,然后将指针所指向的对象置0 void reset ( int * ip ) { * ip = 0 ; // 改变指针ip所指向对象的值 ip = 0 ; // 只改变了ip的局部拷贝,实参未被改变 } void reset ( int i ) { i = 0 ; } int

函数指针数组的最佳实践

匿名 (未验证) 提交于 2019-12-02 23:54:01
1 #include<iostream> 2 #include<fstream> 3 #include<string.h> 4 using namespace std; 5 6 class Student; 7 8 typedef void(CALL)(Student*,int); 9 10 class Student 11 { 12 public: 13 string name; 14 int age; 15 char sex; 16 public: 17 Student(){} 18 ~Student(){} 19 }; 20 21 void write_object(Student *students,int size) 22 { 23 ofstream ofs("text.bat"); 24 if(ofs) 25 { 26 for(int i=0;i<size;i++) 27 { 28 cin>>students[i].name>>students[i].age>>students[i].sex; 29 ofs.write(reinterpret_cast<const char*>(&students[i]),sizeof(students[i])); 30 } 31 } 32 else 33 { 34 cout<<"write failed"<<endl; 35 } 36

指针数组与数组指针,结构体数组与结构体指针

匿名 (未验证) 提交于 2019-12-02 23:49:02
定义: int *p[size] //表示数组存的是指针,有size个指针数据 定义: int (*p)[size] //数组指针,存储size个int类型的数据 指针函数 指针函数是一个函数,该函数返回的是一个指针; 函数指针是一个指针,该指针指向一个函数; #include <stdio.h> int* getIntPoint(const int a) //指针函数,是一个函数 返回一个指针; { int *p = nullptr ; p = new int ; *p = a; return p ; } int main(int argc, char const *argv[]) { int *(*p)(int) = getIntPoint ; //函数指针,该指针指向一个函数; int* pInt = p(5); //使用函数指针; printf("%d\n",*pInt); delete pInt ; return 0; } 申明结构体数组: 结构体名 数组名【size】 结构指针变量说明的一般形式为: struct 结构体名 *结构体指针变量名 struct student *p = &Boy; //假设事先定义了 struct student Boy;

c语言-数组学习总结(3)

匿名 (未验证) 提交于 2019-12-02 23:43:01
数组,指针与函数 指针与数组 数组中几个关键符号(a、a[0]、&a、&a[0])的理解 数组与指针的关系 函数、数组和指针 指针操作 指针与数组 数组名:数组名表示数组的首元素首地址,因此作右值可以直接赋值给指针。 如果有 int a[5]; 则 a和&a[0]都表示数组 首元素a[0]的首地址。(指向首元素) 而&a则表示 数组的首地址。(指向整个数组) 数组中几个关键符号(a、a[0]、&a、&a[0])的理解 结合左值右值去理解(前提是 int a[10]) (1) a不能做左值 (因为数组在初始化之后就不能进行整体操作了),做右值表示首元素的首地址等同于&a[0] (2)a[0]做左值时表示数组第0个元素对应的内存空间;做右值时表示数组第0个元素的值 (3)&a不能做左值;&a做右值时表示整个数组的首地址。 (4)&a[0]不能做左值,做右值时表示首元素的首地址等同于a。 数组与指针的关系 dates+2==&date[2]; //相同的地址 *(dates+2)==dates[2]; //相同的值 以上表明可以的使用指针标识数组的元素和获得元素的值。 定义ar[n]的意思是*(ar+n),可以认为*(ar+n)的意思是“到内存的ar位置,然后移动n个单元,检索存储在那里的值”。 ==另外,还要区别*(dates+2)和*dates+ *( dates+2) /