一直对c指针心怀崇敬,因为总是容易糊涂。看了某大神写的《彻底搞定c指针》更是心怀感激,整理笔记一篇,以表谢意。
1、首先问问自己指针到底是什么东西?
指针就是路标,而不是实际的路。指向真正的路。
2、指针和数组名的区别是啥?
数组名也是指针,但是不可修改。是指针常量!
3、const int *pi与int *const pi有何区别?
const int *pi 这里const 修饰了 *pi,所以*pi不能被改变,但是pi可以!
int *const pi 这里const修饰了pi,所以pi不能被改变,但是*pi可以!
4、值传递
值传递就是把变量值赋给了函数变量,但变量本身不变。
函数定义:exchange1(int x, int y)
函数调用:exchange1(a,b);
结果:a,b的值没有变化
5、地址传递
将地址传给函数指针,将函数指针指向的内容改变,就改变了变量本身。
函数定义:exchange2(int *px, int *py){ int tmp=*px; *px=*py;*py=tmp;}
函数调用:exchange2(&a,&b);
结果:a,b的值互换
6、引用传递
将变量起了个别称,改变别称的值,其实是改变到了变量本身。
函数定义:exchange3(int &x, int &y){ int tmp=x ;x=y; y=tmp;}
函数调用:exchange3(a,b);
结果:a,b的值互换
7、指向指针的指针
注意指针的传递情况也有值传递,地址传递,引用传递,原理一样。
8、函数指针
函数指针比较奇葩,用的方式有好几种,这里写一种就好了。
void MyFun(int);//声明函数
void (*FunP)(int);//声明函数指针
以下是辅助学习的代码
#include<stdio.h>
#include<stdlib.h>
void MyFun(int);
void (*FunP)(int);
void MyFun(int x){
printf("myfun--%d\n",x);
}
int main(){
char a , *pa;
a=10;
pa=&a;
*pa=20;
printf("%d\n",a);
//1.const int*pi //
int i1=30;
int i2=40;
const int *pi=&i1;
pi=&i2;
i2=80; //这里不能用 *pi=80 因为const修饰了*pi,所以不能修改。
printf("%d\n",*pi);
//2、int *const pi; //
int i3=30;
int i4=40;
int *const p2=&i3;
i3=80;
*p2=80;//这句可以。*p2可以修改。
// p2=&i4; //这里不能用p2=&i4; 因为const修饰的是p2
printf("%d\n",*p2);
//3、int *p5指向 const int /
const int i5=50;
int *p5;
// p5=&i5; 不对滴!!
p5=(int *)&i5; //虽然强制转换了,仍然不可以改变i5变量原来的值。
*p5=80;
printf("%d\n",i5);
printf("%d\n",*p5);
//4、const int *p6指向 const int i6/
const int i6=40;
const int *p6;
p6=&i6;
//5、const int *const p7 /
int i7;
const int *const p7=&i7;
//6、函数指针///
MyFun(10);
FunP=&MyFun;
(*FunP)(10);
system("pause");
return 0;
}
运行结果
20
80
80
50
80
myfun--10
myfun--10