关键字:
1、const:修饰普通变量时,变量又被叫做“常变量”,因为具有常量属性,只读,但是仍然可以用地址来修改其内容。
注意:const int *p=&a <=> int const *p=&a;
两者等价,const修饰的都是指针p指向的内存,让指向的内存内容不可发生改变;
如果要const修饰指针的指向则要这样用:
int *const p=&a;
另外,const修饰的静态变量/全局变量是保存在常量区,不可以用指针来修改。
2、typedef:
范例要点:
typedef int* PINT
PINT a,b; //这里的a和b都是int类型的指针,容易误认为只有a是指针。
3、全局变量声明在 .h 文件中,但是定义在 .c 文件中。
指针作为函数参数:
指针的值传参:
void func1(int *q)
{
int b=10;
q=&b;
}
int main()
{
int x=0;
int *p=&x;
printf("before:%p\n",p); //调用函数前的地址
func1(p);
printf("after:%p\n",p); //调用函数后的地址
return 0;
}
以上代码段运行结果为,调用函数前后p的地址相同,对应值也不发生变化,函数内的q操作相当于黑盒,对p毫无影响;
这是因为func1参数确实为地址,但是调用时主调函数传入的参数p时指针;指针本身就是地址,所以对于指针来说,这是指针的数值传参,而不是地址传参。
而如果想要改变这里指针p的地址和内容,有两种办法,用指针的数值传参的返回值,返回改变后指针q;即:
int *func2(int *q)
{
static int b=10; //这里static是因为自定义函数执行结束后,内存会释放这部分空间
所以用static修饰后,生存期更为合法;
q=&b;
return q;
}
int main()
{
int x=0;
int *p=&x;
printf("before:%p\n",p);
p=func2(p);
printf("after:%p\n",p);
return 0;
}
或者利用二级指针,然后主调函数传参时,用指针p的地址,即:
func2(int **q)
{
int b=10;
*q=&b;
}
int main()
{
int x=0;
int *p=&x;
printf("before:%p\n",p);
func2(&p);
printf("after:%p\n",p);
return 0;
}
这样指针就利用地址传参,从而对指针p进行一系列操作。
没了。。。