C语言基础学习笔记(9):指针
图:土星光环
Guderian出品
请把本文与本文与一篇上古时期的佛经C++的指针变量进行对比参考🕮
int *a
和*a
有着巨大的差别:int *a
是定义一个指向int
类型数据的指针a
;*a
是对指针a
解引用(Pointer Dereference),*a
*即为指针a
所指向的内存地址上存储的数据。如:1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
int a = 0, b = 1;
int *pa, *pb;
//不能写成int* pa, pb,这样只表示pa是一个指针变量,pb是一个整型变量
pa = &a;
pb = &b;
printf("a=%d, b=%d\n", a, b);
printf("*pa=%d, *pb=%d\n", *pa, *pb);
return 0;
}输出结果为:
1
2a=0, b=1
*pa=0, *pb=1C
语言中,只要pa
指向a
,*pa
就是a
的别名。指针变量的一大应用就是用作函数参数,这样做的好处就是可以再被调函数中改变实参的值。比如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void Func(int *par);
int main()
{
int arg = 1;
printf("arg = %d\n", arg);
Func(&arg);
printf("arg = %d\n", arg);
return 0;
}
void Func(int *par)
{
printf("par = %d\n", *par);
*par = 2;
}输出结果为:
1
2
3arg = 1
par = 1
arg = 2函数指针(Function Pointer):就是指向函数的指针变量
数据类型 (*指针变量名)(形参列表)
函数指针示例:
若有函数原型:
int Func(int a, int b);
则可定义函数指针
int (*f)(int, int);
令
f = Func;
就是让f
指向函数Func()
- 编译器将不带
()
的函数名解释为该函数的入口地址 - 函数指针变量存储的是函数在内存中的入口地址
- 编译器将不带
正确写法
int (*f)(int, int);
。常见错误:(1)忘了写前一个
()
:int *f(int, int);
,等价于声明了一个函数名为f
、返回值是整型指针类型的函数;(2)忘了写后一个
()
:int (*f);
,等价于定义了一个整型指针变量
看完再看:C++的指针变量
【更多C语言系列】