分类: C/C++
2014-10-11 23:07:14
指针运算:
数组的空间大小为sizeof(array_type)*array_size
指针与整数的运算规则:p + n; ——> (unsigned int)p + n*sizeof(*p);
当p指向一个同类型的数组的元素时:p + 1指向当前元素的下一个元素,p - 1指向当前元素的上一个元素。
指针只有减法(加、乘、除都不合法)相减仅2个指针指向同一数组中的元素时才有意义,表示所指元素的下标差。2个指针相减没指在同一个数
组,结果未定义(可能是分别指向栈空间、堆空间,也可能由cpu块读取的对齐规则决定)。
p1 – p2 ; ——> ((unsigned int)p1 – (unsigned
int)p2)/sizeof(type);
指针比较:< <= >
>= 指针关系运算的前提是同时指向同一个数组的元素。利用指针比较判断循环是否结束。
数组访问2等价方式:
【下标】int a[5];a[1]=3;a[3]=5;ó【指针】int a[5]; *(a + 1)=3;*(a + 3)=5;
当指针以固定的增量在数组中移动其效率高于下标产生的代码,但指针增量为1具有硬件增量模型效果更明显。
a和&a的意义不同在于指针运算,a指向数组开始的地方,&a指向结束的地方。例如:
a +1 => (unsigned int)a + sizeof(*a)
&a + 1 =>(unsigned int)(&a) + sizeof (*&a)
数组作为函数参数时编译器将其编译成对应的指针:
void f(int a[]); ——>void f(int* a);
void f(int a[5]); ——>void f(int* a);
指针和数组的对比:
数组声明时编译器自动分配一片连续内存空间,指针声明时只分配用于容纳指针的4字节空间,在作为函数参数时,数组参数和指针参数等价,数
组名在多数情况下可以看做常量指针,其值不能改变,指针的本质是变量保存的值被看做内存中的地址。