1、父函数(main函数,主函数)调用子函数,子函数能修改父函数中的内容的前提是:(1)传指针;(2)解引用
题目:交换两个数据的值:
void Swap1(int a,int b) //error 只交换了子函数中两个参数的值,当这样函数在主函数中调用时,并没有实现其交换功能(无传指针,也无解引用)
{
int tmp;
tmp=a;
a=b;
b=tmp;
}
void Swap2(int *p1,int *p2) //error
{
int *tmp; //野指针,悬挂指针,没有指向有效的地址
*tmp=*p1; //解指针时崩溃
*p1=*p2;
*p2=*tmp;
}
void Swap(int *p1,int *p2) //right 传指针
{
int tmp=*p1; //解引用,放入变量tmp中
*p1=*p2;
*p2=tmp;
}
# include<stdio.h>
int main()
{
int a=10;
int b=20;
Swap(&a,&b);
return 0;
}
2、指针运算
指针加法:加一个单元,指针加法需要调整,调整的权重为指针本身去掉*,再求sizeof(),如下:
int *p;
p+1; //加4个字节,4=sizeof(int*)*1=4*1
double *p;
p+1;//加8个字节,8=sizeof(double*)*1=8*1
注(单位:字节)char 1B; float 4B ;double 8B ;long double 16B; int 4 ;short 2; long 4;
int main()
{
int *p = (int *)10000;
printf("%d\n",p+1);//10000+1*4=10004 T
printf("%d\n",p+4);//10000+4*4=10016 T
printf("%d\n",(char *)p+4);//10000+4*1=10004 T
printf("%d\n",(short *)p+4);//10000+4*2=10008
printf("%d\n",(double *)p+4);//10000+4*8=10032
printf("%d\n",(unsigned long long )p+1);//10000+1=10001 好坑啊,这是转化为变量了,变量加1。惯性思维,顺利进坑了
printf("%d\n",(int ***)p+1);10000+1*4=10004 T
return 0;
}
3、空指针
int main()
{
int a=10;
int *p=&a;
p=NULL;//空指针,无效的指针
}
4、函数指针
定义:指向函数的指针
使用方法:int( *p)(int, int)或p(int, int)
例如:
int Max(int a,int b) int Min(int a,int b)
{ {
return a>b?a:b; return a<b?a:b;
} }
int (*p)(int,int) //定义函数指针,指向有两个参数的函数
p=&Max; // p存储在代码段中,&p存储在栈里
int x=(*p)(10,20); //加括号先解引用,即引用Max函数。
p=Max;x=p(10,20);//等价于上一行代码。原因是:函数名表示函数本身的入口地址(首地址)。将函数看作一个变量就好。
4、static与const的区别
static,其值可以修改,用于修饰链接属性。
const ,其值不可修改,用于定义常变量。