指针数组

指针数组和数组指针

旧城冷巷雨未停 提交于 2019-12-01 15:41:24
• 数组指针(也称为 行指针) 定义: 指向一维数组的指针。 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跨过了行a[0][] 指向了 a[1][] 指针数组 定义: int *p[n]; []优先级高, 先与p结合成为一个数组,再有 int* 说明这是一个整型指针数组,它有n个指针类型的数组元素, 大专栏 指针数组和数组指针 在这里执行p+1是错误的, p = a 这样的赋值也是错误的, 因为p是个不可知的表示, 只存在p[0]、p[1]、p[2]、….p[n-1], 并且他们分别是指针变量可以用来存放变量地址。 *p = a //这里*p表示指针数组第一个元素的值,a的首地址的值。 如果要将二维数组赋值给一 指针数组: int *p[3]; int a[3][4]; for(int i = 0; i < 3; i++) { p[i] = a[i] } 这里的 int

C语言指针与数组

徘徊边缘 提交于 2019-12-01 15:30:38
C语言数组下标 [] 符号竟是个语法糖? 123456789101112131415 struct { int a[100]; int b[100];};int大专栏 C语言指针与数组> main() { struct ins; int i = 0; for(; i<200; i++) { ins.a[i] = 1; } return 0;} 问:上述程序在运行时是否会产生数组越限? 答:不会。 《C程序设计语言》(第2版·新版)P84写到: 对数组元素a[i]的引用也可以写成 (a+i)这种形式,在计算数组元素a[i]的值时,C语言实际上先将其转换为 (a+i)的形式,然后再进行求值。 如果你没注意到此特性,将有可能导致灾难。 来源: https://www.cnblogs.com/wangziqiang123/p/11690801.html

面试之C++语言相关题目

≯℡__Kan透↙ 提交于 2019-12-01 10:43:32
【C语言】 main()函数是开始执行时所执行的程序的第一个函数,但不是第一个执行的函数。第一个执行的函数是_start(),它通常由C运行库提供,在编译程序时自动链入,此细节高度依赖于操作系统和编译器工具链。 【C++语言特性】 C和C++的区别,C++的好处 C 和C++的对比和好处,在平时应用上有什么感受 C语言的结构体和C++的结构体有什么异同点 C++的结构体其实就是类的一种,只不过类成员默认访问权限是private,结构体默认访问权限是public。 C语言的结构体是不能有函数的,而C++可以有。 C语言的结构体中数据成员没有private、public和protected访问限定,而C++的结构体有访问限制。 C语言的结构体没有继承关系,C++结构体有丰富的继承关系。 new可以搭配free吗,为什么 delete a和delete a[]区别 new是堆分配还是栈分配 new与malloc的区别 c++11 throwing(1) void* operator new (std::size_t size); nothrow(2) void* operator new (std::size_t size, const std::nothrow_t& nothrow_value) noexcept; placement(3) void* operator new

数组名与指向数组的指针

久未见 提交于 2019-12-01 10:04:35
数组名就是指向数组的指针吗?当然不是的。 数组名是“指向数组初始元素的指针”。 “指向数组的指针”应这样定义: int (*array_p)[3]; 如果有数组 int array[3]; ,那么 array_p = &array; 是没有问题的,因为类型相同。但是,如果 array_p = array; 是不可以的。”指向int的指针”与”指向int数组的指针”是不同的。 从地址角度看,两者指向的是同一地址;它们的不同之处在于,做指针运算是结果不同。 做指针运算时,指针以“所指类型的大小”为基本移动距离。 假如int长度是4个字节,array+1前进4个字节;但是对于array_p+1,它应前进一个数组尺寸的距离,即12个字节。 来源: https://www.cnblogs.com/freshair_cnblog/p/11678345.html

牛课-C++基础知识-指针数组/数组指针相关题目

别来无恙 提交于 2019-12-01 10:01:10
1. 对下面变量声明描述正确的有() int *p[n]; int (*)p[n]; int *p(); int (*)p(); int *p[n];—–指针数组,每个元素均为指向整型数据的指针 int (*)p[n];—p为指向一维数组的指针,这个一维数组有n个整型数据 int *p();——函数带回指针,指针指向返回的值 int (*)p();—-p为指向函数的指针 正确答案:A int *p[4]; //表示指针数组,有四个元素,每个元素都是整型指针。 int (*p)[4]; //表示行指针,所指对象一行有四个元素。 int *p(void); //表示函数,此函数无参,返回整型指针。 int(*P)(void) ;//表示函数指针,可以指向无参,且返回值为整型指针的函数。    来源: https://www.cnblogs.com/GuoXinxin/p/11677697.html

Arraylist与linkedlist的区别

╄→гoц情女王★ 提交于 2019-12-01 09:57:01
都是实现list接口的列表,arraylist是基于数组的数据结构,linkedlist是基于链表的数据结构,当获取特定元素时,ArrayList效率比较快,它通过数组下标即可获取,而linkedlist则需要移动指针。当存储元素与删除元素时linkedlist效率较快,只需要将指针移动指定位置增加或者删除即可,而arraylist需要移动数据 来源: https://www.cnblogs.com/Yanss/p/11677272.html

数据结构学习总结 栈和队列

你离开我真会死。 提交于 2019-12-01 09:00:31
一,顺序栈的基本操作 同 顺序表 和 链表 一样,栈也是用来存储逻辑关系为 "一对一" 数据的线性存储结构,如 图 1 所示。 图 1 栈存储结构示意图   从图 1 我们看到,栈存储结构与之前所学的线性存储结构有所差异,这缘于栈对数据 "存" 和 "取" 的过程有特殊的要求: 1,栈只能从表的一端存取数据,另一端是封闭的,如图 1 所示; 2,在栈中,无论是存数据还是取数据,都必须遵循"先进后出"的原则,即最先进栈的元素最后出栈。拿图 1 的栈来说,从图中数据的存储状态可判断出,元素 1 是最先进的栈。因此,当需要从栈 中取出元素 1 时,根据"先进后出"的原则,需提前将元素 3 和元素 2 从栈中取出,然后才能成功取出元素 1。      因此,我们可以给栈下一个定义,即栈是一种只能从表的一端存取数据且遵循 "先进后出" 原则的线性存储结构。    通常,栈的开口端被称为 栈顶 ,封口端被称为 栈底 ; 因此,栈顶元素指的就是距离栈顶最近的元素,拿图 2 来说,栈顶元素为元素 4;同理,栈底元素指的是位于栈最底部的元素,图 2 中的栈底元素为元素 1。                                                图 2 栈顶和栈底 进栈和出栈 基于 栈结构的特点,在实际应用中,通常只会对栈执行以下两种操作: 向栈中添加元素,此过程被称为"进栈"

指针数组和结构体指针

。_饼干妹妹 提交于 2019-12-01 08:30:33
1.指针数组 1)关于指针数组 一个数组,里面存储的是指针(也就是带*的类型) 指针数组: char* arr[5] = {0}; //用0填充数组 arr[0] = (char*)1; arr[1] = (char*)2; arr[2] = (char*)3; arr[3] = (char*)4; arr[4] = (char*)5; char a1 = 'A'; char a2 = 'B'; char a3 = 'C'; char a4 = 'D'; char a5 = 'E'; char* p1 = &a1; char* p2 = &a2; char* p3 = &a3; char* p4 = &a4; char* p5 = &a5; char* arr[5] = {p1,p2,p3,p4,p5}; 指针数组在内存中存储的方式: 2)指针数组的用法 1】字符串放在常量区,常量区的字符串地址存入指针数组 char* p1 = "if"; char* p2 = "for"; char* p3 = "while"; char* p4 = "switch"; char* keyword[] = {p1,p2,p3,p4}; 2】和上一种方式的效果一样,实际上指针数组存放的是常量区字符串的地址; char* keyword[] = { "if", "for", "while",

多级指针和数组指针

╄→гoц情女王★ 提交于 2019-12-01 08:30:31
1.*()和[] 定义几个不同级别的指针类型的数据 char* p1; char** p2; char*** p3; char**** p4; char***** p5; char****** p6; char******* p7; 1)*运算 代码: printf("%d",*p1); 反汇编: 结论: *运算的本质是取指针变量的值,利用这个值作为地址来寻址获取结果; 代码: printf("%d",*(p1+0)); 分析: 根据指针类型的特性,p1+0所得的类型还是char*类型, 并且所得的值要加上为去掉一个*后的类型的宽度乘以所加的数,而char的宽度是1,结果还是和原来一样; 反汇编和*P1没有区别: 结论:*(p1) ==*(p1+0) 2)[]运算 *(p1+0)可以用另一种写法:p1[0] printf("%d",p1[0]); 反汇编: 分析: *(p1+0)和p1[0]生成的反汇编代码完全一样; 结论: *(p1+0) == p1[0] 代码: printf("%d",*(p1+2)); printf("%d",p1[2]); 反汇编: 分析: *(p1+2)是用p1+2所得的值来寻址:p1+(char*去掉一个*后的类型的宽度也就是char=1)x2; *(p1+2)的反汇编和p1[2]完全一样; 结论: *(p1+2) == p1[2] 3)多级指针

多维数组指针和函数指针

半城伤御伤魂 提交于 2019-12-01 08:30:21
1.多维数组指针 1)用一维数组指针访问一维数组 代码: void fun(){ int arr[5] = {1,2,3,4,5}; int (*p)[5] = &arr; printf("%d\n", *(*(p) + 2)); //结果是3 int (*px)[2] = (int (*)[2])arr; //强转为宽度为两个int的数组指针类型 printf("%d\n", *(*(px+1)+1)); //结果是4 } 分析: 取地址运算&后的arr是其类型加上一个*,也就是int (*)[5]; &arr的值和arr的值一样都是数组的首地址,只是类型不一样; *p是数组类型,相当于int*,根据带*类型的加法特性,相当于加2个int宽度,也就是从执行1到指向了3; int*做解引用,结果是3; px是两个int的数组指针,用强转的方式给它赋值,此时指向arr首地址; px+1的结果是加上px的类型去掉一个*的宽度,也就是加上两个int的宽度; *(px+1)是数组类型,相当于int*,加1后再加上一个int宽度; 总共加了3个int宽度,指向了4; 2)一维数组指针访问二维数组 代码: void fun(){ int arr[2][5] = {{1,2,3,4,5},{6,7,8,9,10}}; int (*p)[5] = (int (*)[5])arr; printf("