指针笔记小结(03.06)
1.基础知识
&取地址运算符,*指针运算符
void swap(int *p1,int *p2){
int temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
上面的代码如果temp变为temp则是错误的,对temp赋值相当于对一个未知的存储单元赋值。 下面的代码无法完成交换:
void swap(int *p1,int *p2){
int *p;
p=p1;
p1=p2;
p2=p;
}
无法完成的交换的原因是:这里的数据传递是值传递
2.利用指针引用数组
所谓数组元素的指针就是数组元素的地址。
int a[10]={1,2,3,4,5,6,7,8,9,10};
int *p;
p=&a[0];//不可以写成*p=&a[0],但可以写成int *p=&a[0]
p=&a[0]等价于p=a,p的值是a[0]的地址。 如果指针变量p1和p2都指向同一数组中的元素,如执行p2-p1,结果是p2-p1的值(两地址之差)除以数组元素的长度。但两个地址相加是没有意义的,如p1+p2;
3.C语言之int *f()、int(*f)()、int *a[]、int (*a)[] 区别小记
int *f()表示这个函数的功能是返回一个地址。
int(*f)()表示这是一个函数的指针。它要指向一个函数才能有用,指向一个函数之后可以用它来代替该函数。之后使用这个指针相当于使用该函数。(int(*p)[10]是一个数组指针,p是一个指针指向 int[10] 数组)
int a[]是一个指针数组,表示数组中的每一个元素都是一个指针,可以指向一个int类型的数值。( 如int p[10], 是一个指针数组,p是一个数组,数组每个元素是个指向int型的指针。)
int (*a)[]这是一个指向多维数组的指针变量。
[]的结合性大于*,(p)[10]表示p指向一个大小为10的数组,且每个数组的元素为一个指针。((p)[10])是一个函数指针,该函数的参数是int,返回值是int。
指针函数:当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数,以用于需要指针或地址的表达式中。 声明格式为:类型说明符 *函数名(参数)。比如: int * foo(int,int); 函数指针:指向函数的指针包含了函数的地址,可以通过它来调用函数。 声明格式:类型说明符 (*函数名)(参数)。比如:void (*fptr)();