指针数组
1、指针在本质上也是一个变量ide
2、指针须要占用必定的内存空间函数
3、指针用于保存内存地址的值spa
4、能够指向任何地方的内存空间很是的强大才能够写一个操做系统操作系统
5、指针
*号意义内存
1、在指针声明时*号表示所声明的变量为指针编译器
2、在指针使用时*号表示取指针所指向的内存空间中的值it
指针是变量所以能够声明指针参数编译
1、当一个函数体内部须要改变实参的值则须要使用指针参数
2、函数调用时实参值将复制到形参
3、指针适用于复杂数据类型做为参数的函数中
Const修饰的
constint*p;//p可变p指向的内容不可变
1、intconst*p;//p可变p指向的内容不可变
2、int*constp;//p不可变p指向的内容可变
3、constint*constp;//p和p指向的内容都不可变
4、constTypeNmmeElem和TypeNameconstp都是TypeName不能够改变
当const出如今*号左边时指针指向的数据为常量
当const出如今*后右边时指针自己为常量
总结
1、指针是C语言中一种特别的变量
2、指针所保存的值是内存的地址
3、能够经过指针修改内存中的任意地址内容
数组
1、数组在一片连续的内存空间中存储元素
2、数组元素的个数能够显示或隐式指定
显示inta[5]={1,2,3}
隐式inttem[]={1,2,3}
1、数组名表明数组首元素的地址
2、数组的地址须要用取地址符&&才能获得
3、数组首元素的地址值与数组的地址值相同
4、数组首元素的地址与数组的地址是两个不一样的概念
1、数组名能够看作一个常量指针
2、数组名“指向”的是内存中数组首元素的起始位置
3、在表达式中数组名只能做为右值使用
4、只有在下列场合中数组名不能看作常量指针
5、数组名做为sizeof操做符的参数表明整个数组
6、数组名做为&运算符的参数
7、数组是一片连续的内存空间
8、数组的地址和数组首元素的地址意义不一样
9、数组名在大多数状况下被当成常量指针处理
10、数组名其实并非指针在外部声明时不能混淆
数组和指针的分析
1、数组是一段连续的内存空间
2、数组的空间大小为sizeof(array_type)*array_size
3、数组名可看作指向数组第一个元素的常量指针
p+n=(unsignedintp)+n*sizeof(*p)
当前元素的下一个元素p-1将指向当前元素的上一
个元素。
4、指针之间只支持减法运算且必须参与运算的指针类型必
须相同
p1–p2;((unsignedint)p1-(unsignedint)p2)/sizeof(type);
注意
只有当两个指针指向同一个数组中的元素时指针
相减才有意义其意义为指针所指元素的下标差结果未定义的.缘由1、不一样的栈之间相减有用么2不一样数组之间还存在内存对齐的
当两个指针指向的元素不在同一个数组中时问题这样子其结果也是无心义的
1、指针也能够进行关系运算
<<=>>=
2、指针关系运算的前提是同时指向同一个数组中的元素
3、任意两个指针之间的比较运算(==,!=)无限制
4、如下标的形式访问数组中的元素
5、以指针的形式访问数组中的元素
6指针指向并未访问不算越界的
从理论上而言当指针以固定增量在数组中移动时其效
率高于下标产生的代码
当指针增量为11且硬件具备硬件增量模型时表现更佳硬件加速基于指针的访问
数组的访问形式是unsignedintp+sizeoftype*n
指针访问形式unsignedintp+4不断地自加因为缺乏了乘法效率变得更快。
文件内的数组参数要表示指针传递过程当中会丢失数组大小
C语言中数组做为函数参数时编译器将
其编译成对应的指针
voidf(inta[]);??voidf(int*a);
voidf(inta[5]);??voidf(int*a);
结论
通常状况下当定义的函数中有数组参数时须要定
义另外一个参数来标示数组的大小。
数组声明时编译器自动分配一片连续内存空间
1、指针声明时只分配了用于容纳指针的44字节空间
2、在做为函数参数时数组参数和指针参数等价
3、数组名在多数状况能够看作常量指针其值不能改变
4、指针的本质是变量保存的值被看作内存中的地址