指针
1、指针在本质上也是一个变量
2、指针需要占用一定的内存空间
3、指针用于保存内存地址的值
4、可以指向任何地方的内存空间非常的强大才可以写一个操作系统
5、
*号意义
1、在指针声明时*号表示所声明的变量为指针
2、在指针使用时*号表示取指针所指向的内存空间中的值
指针是变量因此可以声明指针参数
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、指针的本质是变量保存的值被看做内存中的地址