本文目录
- 引言
- 正文
- 快乐的时光总是短暂,咱们下篇博文再见啦!!!不要忘了,给小编点点赞和收藏支持一下,在此非常感谢!!!我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=pw3ykc3fqyp1
引言
指针作为C语言语法学习中的一块既极重要又极难懂的知识点,让初学C语言的我们常常苦不堪言。而本文就是为了让像曾经的作者一样的宝子们深刻理解指针这一章节的内容而作,那接下来就跟随作者的视角,一起把各种类型的指针理解透彻!
正文
内置类型数据是我们最为常用的数据类型,所以指针的学习我们就从它开始。
(1)内置数据类型指针
详见:
类型 | 内涵及应用 |
---|---|
整型指针int* | 指向整数的指针 |
浮点型指针float* ,double* | 指向浮点数的指针 |
字符(型)指针char* | 指向字符的指针,常用于字符串处理 |
布尔型指针bool* | 指向布尔值的指针 |
其次就是自定义类型指针,一起来看看吧!!
(2) 自定义类型指针
这里小编先从数组与指针开始讲起。
1.数组指针与指针数组
数组指针和指针数组是C编程中两个重要的概念,它们虽然名字相似,但含义和用法却有很大的不同。我们先来看看这两个的定义:
主要区别在于它们的使用场景和内存布局。
- 总之,理解数组指针和指针数组的区别对于编写高效的C语言程序至关重要。掌握它们各自的特性和适用场景,可以帮助我们更好地设计和实现程序。
2. 结构体指针
我们以一个代码为例:
#include<stdio.h>
struct book {
char name[20];
char author[20];
int prince;
};
void print(struct book* p) {
printf("%s %s %d\n", (*p).name, (*p).author, (*p).prince);
printf("%s %s %d\n", p->name, p->author, p->prince); //“->”操作符可用在:结构体指针指向我们想要访问的结构体中的元素;
}
int main() {
struct book b1 = {"C语言", "张三", 10};
printf("%s %s %d\n", b1.name, b1.author, b1.prince); //“.”操作符可用在:找到我们想要访问的结构体的元素。
print(&b1);
return 0;
}
这里的struct book* p
就是一个结构体指针变量
主要优点:是它们提供了一种通过内存地址间接访问和修改结构体成员的方法。这在处理大型数据结构时尤其有用,因为它们可以减少内存复制,提高程序的效率。
- 总之,结构体指针提供了一种高效、灵活的方式来访问和操作结构体数据,是编写高效、模块化代码的关键。理解结构体指针的工作原理和正确使用它们,对于任何C/C++程序员来说都是一项基本技能。
3.联合体指针
(1)联合体指针的定义
(2)联合体指针的使用
联合体指针的使用特点:
(3)联合体指针的注意事项
- 联合体指针提供了一种节省空间且灵活的方式来处理不同类型的数据。
(3)函数指针
函数指针是C语言中一个强大的特性,它允许将函数的地址赋给一个变量,使得可以通过这个变量来调用函数。这种机制提供了一种灵活的方式来处理函数,使得函数可以像数据一样被传递和操作。
1.函数指针的定义
这里,funcPtr
是一个指向函数的指针,它可以存储add
函数的地址。
2.函数指针的赋值
这是因为:在C语言中,函数名本身就是一个指向函数的指针,因此可以直接赋值给函数指针。
3.函数指针的使用
例如,int result = funcPtr(5, 3); // 调用add函数
4.函数指针作为参数
函数指针常用作其他函数的参数,这使得函数可以接收另一个函数作为输入,从而提供高度的灵活性。例如,可以定义一个接受函数指针作为参数的函数:
void applyFunction(int x, int y, int (*func)(int, int)) {
int result = func(x, y);
// 处理结果
}
在这个例子中,applyFunction
接受两个int
参数和一个函数指针参数,然后调用这个函数指针指向的函数。
5.函数指针作为返回值
小编已经在之前的函数篇提及。
6.函数指针的注意事项
在C语言中,空指针(Null Pointer)是一个特殊的指针值,它不指向任何有效的对象或函数。空指针的主要作用是表示“没有指向任何东西”或“没有有效的地址”。在C语言中,空指针常被用来表示一个指针变量尚未被分配具体的内存地址,或者用来表示某个指针变量不再指向任何对象。
(4)空指针(NULL
)
(1)空指针的使用
空指针通常用于以下几种情况:
(2)空指针与空字符
需要注意的是:空指针(NULL
)和空字符('\0'
)是两个完全不同的概念。空指针是一个指针值,表示没有指向任何对象,而空字符是一个字符值,通常用来表示字符串的结束。
(3)空指针的注意事项
结论:
- 空指针可以帮助程序员处理指针变量的未初始化状态和错误情况。
(5)二级指针
在C语言中,二级指针(Double Pointer)是指指向指针的指针。它是一个指针变量,存储的值是另一个指针变量的地址。二级指针在处理动态内存分配、多维数组、函数参数传递等方面非常有用。理解二级指针对于深入掌握C语言的指针操作至关重要。
(1)二级指针的定义
(2)二级指针的内存分配
(3)二级指针的使用
(4)二级指针作为函数参数
二级指针也常用于函数参数,特别是需要修改指针指向的值或者需要传递多维数组时。
(5)二级指针的注意事项
在C语言中,常量指针和指向常量的指针是两个不同的概念,它们在声明和使用上有所区别,但都与指针和常量的关系有关。
(6)常量指针与指向常量的指针(const 的用法)
1.指向常量的指针(Pointer to a Constant)
这里,ptr
是一个指向int
类型的常量的指针。这意味着你可以通过ptr
来改变它所指向的地址,但是不能通过ptr
来改变所指向地址处的值。
2.常量指针(Constant Pointer)
这里,ptr
是一个常量指针,它被初始化为指向value
的地址,之后你不能再让ptr
指向另一个地址,但可以通过ptr
来修改value
的值。
3.常量指针指向常量(Constant Pointer to a Constant)
在这个例子中,ptr
是一个常量指针,指向一个int
类型的常量。这意味着ptr
的值(即它所指向的地址)不能被改变,同时ptr
所指向的数据也不能被修改。
4.使用场景和注意事项
- 常量指针与指向常量的指针提供了不同的保护级别,帮助程序员控制数据的访问和修改。