C 指针

下面介绍几个指针中比较容易混淆的概念。

函数指针

本身是指针,比较的特殊,其指向函数的入口。
C 语言在编译的时候,会对每一个函数在内存中分配一个入口地址,该入口地址就是函数指针所指向的地址。

定义 类型 (*p)()

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>

// 交换值
void swap(int *a, int *b)
{
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
}

int main(void)
{
void (*p)() = NULL;
p = getMax; // 函数名表示函数的指针
int a = 1, b = 2;
printf("src:%d - %d\n", a, b);
(*p)(&a, &b); // 这种写法比较容易区别
// p(&a, &b); // 也可以这样写
printf("res:%d - %d\n", a, b);
return 0;
}

指针函数

本身是函数,返回值为指针,这个概念比较好理解。

类型 *函数名(参数列表…)

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>

// 返回最大值的指针
int *getMax(int *a, int *b)
{
if (*a > *b) {
return a;
}
return b;
}


int main(void)
{
int a = 1, b = 2;
int *max = getMax(&a, &b);
printf("max :%d\n", *max);
return 0;
}

指针常量

指针是形容词,常量是名词。这回是以常量为中心的一个偏正结构短语。那么,指针常量的本质是一个常量,而用指针修饰它,那么说明这个常量的值应该是一个指针。
指针常量的值是指针,这个值因为是常量,所以其指针指向不能改变,但指向的值可以修改。

int *const p;

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>

int main(void)
{
int num = 100, price = 200;
int * const p = &num;
// p = &price; // 指针是常量,不能改变
*p = 200; // 指向的值可以修改
printf("%d\n", *p);
return 0;
}

常量指针

常量是形容词,指针是名词,以指针为中心的一个偏正结构短语。这样看,常量指针本质是指针,常量修饰它,表示这个指针乃是一个指向常量的指针(变量)。
指针指向的对象是常量,那么这个对象不能被更改,但是指针的指向是可以修改的。

int const *p;

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
int main(void)
{
const int a = 100;
int const *p = &a;
// *p = 200; // 错误的,指向的是一个常量,常量不能修改
int num = 200;
p = &num; // 可以修改指针的指向
printf("%d\n", *p);
return 0;
}

上面的几个概念比较容易混淆,那么比较好记的方法就是,他们的偏重点就在后面两个字名词上面,这样就记住了。

©版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 & 作者信息

End

坚持原创技术分享,您的支持将鼓励我继续创作!
Flyertutor WeChat Pay

WeChat Pay

Flyertutor Alipay

Alipay