IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> C语言--指针 -> 正文阅读

[数据结构与算法]C语言--指针

目录

一、指针是什么

二、为什么要使用指针

三、如何申明一个指针

1.申明并初始化一个指针

2.未初始化和非法的指针(野指针)

3.空指针

四、指针的运算

五、指针与数组

1.指针与数组的关系

2.指针数组

3.数组指针

六、指针与结构

1.结构体

2.结构指针

七、指针与函数

1.函数指针

2.函数指针数组

3.指向函数指针数组的指针

4.回调函数


一、指针是什么

在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向
(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以
说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址
的内存单元,就好比你知道某某街某某号就能找到具体的地点

那么我们可以这么理解

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?内存:

一个字节0XFFFFFFFF
一个字节0XFFFFFFFE
一个字节…………
一个字节…………
一个字节…………
一个字节…………
一个字节0X00000002
一个字节0X00000001
一个字节0X00000000

这是一个4GB大小的内存,可以存放2^32个字节的数据。一个地址对应一个字节的内存空间,地址是连续存储的。

指针也是变量,用来存放地址的变量。(存放在指针中的值都被当成地址处理)。

二、为什么要使用指针

  在C语言中,指针的使用非常广泛,因为使用指针往往可以生成更高效、更紧凑的代码。总的来说,使用指针有如下好处:

1)指针的使用使得不同区域的代码可以轻易的共享内存数据,这样可以使程序更为快速高效;

2)C语言中一些复杂的数据结构往往需要使用指针来构建,如链表、二叉树等;

3)C语言是传值调用,而有些操作传值调用是无法完成的,如通过被调函数修改调用函数的对象,但是这种操作可以由指针来完成,而且并不违背传值调用。

?

三、如何申明一个指针

1.申明并初始化一个指针

我们都知道变量有不同的类型,同样指针也有相对应的类型

当有这样一个代码:

int num = 10;
p = #

?要将&num(num的地址)保存到p中,我们知道p就是一个指针变量,那我们就要给指针变量相应的类型。

char ?*pc = NULL;? ? ? ? ? ? ? ? ?//声明并初始化一个 char? ? ? 类型的指针? p
int ?*pi = NULL;? ? ? ? ? ? ? ? ? ? ?//声明并初始化一个?int? ? ? ? ?类型的指针? p
short *ps = NULL;? ? ? ? ? ? ? ? ?//声明并初始化一个?short? ???类型的指针? p
long ?*pl = NULL;? ? ? ? ? ? ? ? ? //声明并初始化一个?long? ? ? 类型的指针? p
float *pf = NULL;? ? ? ? ? ? ? ? ? ?//声明并初始化一个?float? ? ? 类型的指针? p
double *pd = NULL;? ? ? ? ? ? ? //声明并初始化一个 double? 类型的指针? p

?char* 类型的指针是为了存放 char 类型变量的地址。
short* 类型的指针是为了存放 short 类型变量的地址。
int* 类型的指针是为了存放 int 类型变量的地址。

那么为什么指针还要划分不同的类型呢?它的作用是什么?

#include <stdio.h>
//演示实例
int main()
{
int n = 10;
char *pc = (char*)&n;
int *pi = &n;
printf("%p\n", &n);
printf("%p\n", pc);
printf("%p\n", pc+1);
printf("%p\n", pi);
printf("%p\n", pi+1);
return ?0;
}

?

?我们通过对比不难发现,不论是整型指针还是字符指针,它指向的地址都是n的地址,但是地址加1之后结果却不一样了,整型指针跳过了四个字节,字符指针跳过了一个字节。

由此,我们可以得出以下结论:

指针的类型决定了指针向前或者向后走一步有多大(距离)。?

2.未初始化和非法的指针(野指针)

1.指针未初始化:

#include <stdio.h>
int main()
{
int *p;//局部变量指针未初始化,默认为随机值
??*p = 20;
return 0;
}

2.指针越界

#include <stdio.h>
int main()
{
??int arr[10] = {0};
??int *p = arr;
??int i = 0;
??for(i=0; i<=11; i++)
?{
????//当指针指向的范围超出数组arr的范围时,p就是野指针
????*(p++) = i;
?}
??return 0;
}?

3.指针指向的空间被释放

3.空指针

?不指向任何函数和变量的地址,一般在初始化和用完之后使用,NULL的值为0.

int* p=NULL;

四、指针的运算

指针+-整数:

指针指向的是地址,所以也可以进行加减运算

指针加减整数不会改变指针自身的地址,只是改变了它所指向的地址。

?指针-指针:

只有两个指针都指向同一个数组的元素的时候才允许使用。

指针减指针的差的绝对值是两个指针在内存中的距离,结果是以元素个数为单位。

五、指针与数组

在C语言中,指针与数组之间的关系十分密切。许多可以用数组来完成的工作都可以用指针来完成。

指针运用起来效率也比数组要高。

1.指针与数组的关系

我们先声明一个数组:

int arr[10];

我们可以用arr[0],arr[1],......arr[9]来表示这个数组中的10个元素,这10个元素是存储在一段连续相邻的内存区域中的。

接下来,我们再声明一个指针:

int* p=NULL;?

p是一个指针变量,指向内存中的一个地址,我们先对它初始化:

p=&a[0];?

?int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,0};

int* p=&arr;
??printf("%p\n", arr);
??printf("%p\n", &arr[0]);

?printf("%p\n", &arr[0]);
??return 0;
}

?三个地址是相同的。

那我们就可以进行如下操作:

int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
int *p = arr; //指针存放数组首元素的地址
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i = 0; i<sz; i++)
{
printf("%d ", *(p + i));
}
return 0;
}?

2.指针数组

?指针数组是一个数组,是用来存放指针的数组

3.数组指针

数组指针是指针,它指向一个数组。

int (*p)[10];

六、指针与结构

1.结构体

2.结构指针

七、指针与函数

1.函数指针

2.函数指针数组

3.指向函数指针数组的指针

4.回调函数

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-11-20 18:38:52  更:2021-11-20 18:39:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/9 1:09:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码