const修饰指针
const在正常修饰变量的时候是将一个变量变为常量。例如const int a;即定义一个常量a。
而在const修饰指针时有三种不同的情况:
1.const int *p;
将const放在最前面,表示为const修饰指针指向地址的变量,使其变为指针状态下的常量(可以直接修改变量,但不能通过指针来修改变量)
例如:
我们不能通过*p=10;来修改,但是可以通过a=10;(假设变量为a)来修改。
2.int const *p;
当const放在中间时,表示为将指针修饰为常量,即不能更改指针所指向的地址。
例如:
如果刚开始p指向的是a的地址,那我们就不能让他在去指向b的地址。
3.const int const *p;
此时 意义就是把指针和变量都变为常量,具体和前两个一样。
两个指针相减
当两个指针相减时,所得到的结果为指针的偏移量,而且两个指针相间的结果为int型。
#include<stdio.h>
int main()
{int a[10]={1,2,3,4,5,6,7,8,9,10};int *ftemp=a;int *rtemp=a;rtemp+=5;int b;b=rtemp-ftemp;printf("%d",b);}
此时输出的就是5。
值传递&地址传递
当我们用函数来进行一些进程的时候时不能将函数里形参的值传递给实参的,因为当函数执行完后就会自动将形参的变量地址清空。二而我们有时候想要这些值,这时候我们就要用指针进行地址传递。
#include<stdio.h>
int warp(int*a,int *b)
{int temp;temp=*a;*a=*b;*b=temp;
}
int main()
{int a=10,b=20;int *aa,*bb;aa=&a;bb=&b;warp(aa,bb);printf("a=%d\nb=%d",a,b);}
像这样就可以把主函数中a与b的值进行替换。
而如果不使用指针则不能进行替换。
指针&数组
提一下,数组名是个常量。
当指针指向数组的时候指向的是数组的首地址,而数组名其实也是类似于指针,他也是指向数组的首地址的。所以我们可以用指针来代替数组(但是感觉没必要,更麻烦了)
例如:
int a[10][10];
p=&a;
则p就指向了a数组的首地址
此时我们再如果将两者输出
printf(“%p\n”,a);
printf(“%p\n”,p);
则两者的输出结果相同。
如果我们让*p=*(p+1)则此时指向的是a[0][1]
所以我们可以通过改变p的偏移量来改变p指向数组a中具体的值。
而如果我们定义一个二级指针
int **pp=&p;
此时得到了一个指向指针p的指针pp,此时pp称为二级指针。
然后我们使**p=**(p+1);
此时**p指向的是a[1][0]
通过此处可以看出二级指针+1直接是提升二维数组的一列而不是一行。
由此我们可以得出结论:一级指针+1增加二维数组的行数
而二级指针+1是增加二维数组的列数。