c语言初阶指针

这篇具有很好参考价值的文章主要介绍了c语言初阶指针。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

何为指针

地址大小

野指针

成因 

 如何规避

 有效性

指针计算

+-整数

​编辑

 指针比较运算

指针-指针

​编辑 数组与指针关系

二级指针

指针数组

应用 


何为指针

指针就是指针变量,用来存放内存空间的一个编号,将指针比作我们宾馆的客人,内存空间就是一个个的房间,每一个指针变量对应一个地址空间。

c语言初阶指针,数据结构,jvm

int a = 0;
int *pa = &a;

 pa记录了a的地址int除了代表指向数据的类型,还可以表示访问字节的能力

c语言初阶指针,数据结构,jvm

内存单元的单位是字节,而每个内存单元都有自己唯一的编号,而指针指向的是首元素第一个字节的地址,当我们 对指针进行加减操作时,也是按照数据所占的字节数来向前向后偏移的。

也就是说char类型指针加一跳过一个字节,int类型指针加一跳过四个字节.......

地址大小

x86

c语言初阶指针,数据结构,jvm

x64 

c语言初阶指针,数据结构,jvm

野指针

定义:指向未定义的空间(随机的、不正确、没有明确限制的

成因 

1.指针未初始化 

	int* p;//p就是野指针
	*p = 20;

2.越界访问

	int arr[10] = {0};
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	int* p = arr;
	for (i = 0; i <= sz; i++)
	{
		*p = i;
		p++;
	}

对数组越界访问未初始化的空间,出现了野指针。 

3.指向空间释放

int* test()
{
	int num = 100;
	return &num;
}

int main()
{
	int* p = test();
	*p = 200;

	return 0;
}

函数销毁后通过指针接收归还给内存空间的地址,并对其进行修改,这也是一种典型的野指针。

 如何规避

  • 指针初始化(可初始化为NULL)
  • 小心指针越界
  • 指向空间释放(free)时,及时置NULL
  • 避免返回局部变量(栈空间)的地址
  • 指针使用前检查有效性

 有效性

	int* p = NULL;

	if (p != NULL)//不为空再使用
	{
		printf("%d\n", *p);
	}

指针计算

+-整数

指针接收一个数组实际接收的是它首元素的地址,数组名等价于首元素地址,

c语言初阶指针,数据结构,jvm

指针接收一个数组实际接收的是它首元素的地址,数组名等价于首元素地址,通过+-整数来实现向前向后的一个偏移,偏移量为该类型所占内存大小。

 指针比较运算

    #define N_VALUES 5   
    float arr[N_VALUES];
	float* vp;
	for (vp = arr; vp < &arr[N_VALUES];)//从前往后
	{
		*vp++ = 0;//++优先级高
	}
	

修改(不推荐): 

#define N_VALUES 5   
float arr[N_VALUES];
float* vp;
for (vp = &arr[N_VALUES-1]; vp >= &arr[N_VALUES];vp--)//从后往前
	{
		*vp = 0;
	}

第一种方案是与数组后面的指针进行比较,然后依次赋值,第二种方案是从后往前比较,在完成首元素赋值后对前一个地址进行比较不符合条件退出循环。

c语言初阶指针,数据结构,jvm 

规定:允许指向数组元素的指针与指向数组最后一个元素后面的内存空间比较大小,不允许与指向数组首元素前的内存空间比较。所以前者是规范写法。

指针-指针

两个指针的相减不是简单的内存编号相减,而是指向同一块连续空间同类型指针(地址)相减,所得结果为二者相差的元素个数(偏移量)

我们可以在模拟实现strlen函数的时候利用这点得到字符的个数: 

 数组与指针关系

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int* p = arr;
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	/*for (i = 0; i < sz; i++)
	{
		printf("%d ", *p);
		p++;
	}*/

	for (i = 0; i < sz; i++)
	{
		printf("%d ", *(p + i));
	}

	return 0;
}

        观察上面的代码,发现数组和指针就是一个模子刻出来的一样,实际上它们是有区别的。

        不同:数组是一块连续的空间,用于存放各种数据,它的大小取决于元素个数,而指针是一个变量,用于存放地址,大小为4\8字节。

        联系:数组名是地址(指针),数组把首元素地址交给指针后,可以用指针来管理数组。

二级指针

和一级指针一样,二级指针也是用于存放地址,它存放的是一级指针的地址。 

c语言初阶指针,数据结构,jvm

c语言初阶指针,数据结构,jvm 

蓝色圆圈代表指针存放地址的那个变量的数据类型,*p代表了指针。如果想通过它访问a的值,只需进行两次解引用即可。

指针数组

顾名思义,存放指针的数组就叫做指针数组。

int* arr3[5];//存放整型指针的数组
char* arr4[6];//存放字符指针的数组

应用 

 我们可以用多个一维数组模拟二维数组来使用指针数组。

c语言初阶指针,数据结构,jvm

这里我们成功模拟出了二维数组,但它和实际的二维数组还是有些差别,比如二维数组是连续的空间,而指针数组的每个元素是不连续的,但毕竟是模拟,目的是为了了解指针数组的具体功能。文章来源地址https://www.toymoban.com/news/detail-699854.html

到了这里,关于c语言初阶指针的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 『初阶数据结构 • C语言』④ - 冒泡排序

      本文内容借鉴一本我非常喜欢的书——《数据结构与算法图解》。学习之余,我决定把这本书精彩的部分摘录出来与大家分享。      本章内容 写在前面 1.冒泡排序 2.冒泡排序实战 3.冒泡排序的实现 4.冒泡排序的效率 5.二次问题 6.线性解决 7.总结     大 O记法能客观地衡量

    2024年02月16日
    浏览(31)
  • 『初阶数据结构 • C语言』⑤ - 选择排序

    本文内容借鉴一本我非常喜欢的书——《数据结构与算法图解》。学习之余,我决定把这本书精彩的部分摘录出来与大家分享。     目录 写在前面 1.选择排序 2.选择排序实战 3.选择排序的实现 4.选择排序的效率 5.忽略常数 6.大O的作用 7.总结     大 O 是一种能够比较算法效

    2024年02月14日
    浏览(32)
  • 『初阶数据结构 • C语言』② - 算法为何重要

    本文内容借鉴一本我非常喜欢的书——《数据结构与算法图解》。学习之余,我决定把这本书精彩的部分摘录出来与大家分享。   算法这个词听起来很深奥,其实不然。它只是解决某个问题的一套流程。  准备一碗麦片的流程也可以说是一种算法,它包含以下 4步(对我来说

    2024年02月14日
    浏览(26)
  • 『初阶数据结构 • C语言』⑥ - 插入排序&希尔排序

    学习目标 写在前面 1.插入排序 2.插入排序实战  3.插入排序的实现  4.插入排序的效率 5.平均情况 6.希尔排序 7.希尔排序的实现 8.希尔排序的效率 9.总结   之前我们衡量一个算法的效率时,都是着眼于它在最坏情况下需要多少步。原因很简单,连最坏的情况都做足准备了,其

    2024年02月15日
    浏览(31)
  • 数据结构初阶之顺序表(C语言实现)

    顺序表是数据结构里面很基础的一类,它是线性表的一种,其它线性表还有链表、栈和队列等,今天来和博主一起学习关于顺序表的知识吧。 顺序表,它分为两类: 动态顺序表 和 静态顺序表 ,这两个表的区别就是 前者的空间不固定 ,是 支持扩容 的,后者的 空间是固定

    2024年02月03日
    浏览(34)
  • 【c语言指针详解】复杂数据结构的指针用法

    目录 一、动态内存分配 1.1 使用malloc和free函数进行内存的动态分配和释放 1.2 内存泄漏和野指针的概念和解决方法 二、复杂数据结构的指针用法 2.1 结构体指针和成员访问操作符 2.2 指针数组和指向指针的指针 2.2.1 指针数组 2.2.2 指向指针的指针 2.3 动态内存分配与结构体

    2024年02月04日
    浏览(39)
  • 初阶数据结构之---顺序表和链表(C语言)

    线性表: 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构。线性表在逻辑上是线性结构,也就是说是连续的一条直线。但在物理上并不一定是连续的。线性表在物理上存储时,通常以 数组 和 链式结构 的形式存储。

    2024年02月22日
    浏览(43)
  • C语言数据结构初阶(10)----二叉树的实现

    · CSDN的uu们,大家好。这里是C语言数据结构的第十讲。 · 目标:前路坎坷,披荆斩棘,扶摇直上。 · 博客主页: @姬如祎 · 收录专栏: 数据结构与算法     目录 1. 函数接口一览 2. 函数接口的实现 2.1 BTNode* BuyNode(BTDataType x) 的实现 2.2 BTNode* CreateTree() 的实现  2.3 void

    2023年04月08日
    浏览(31)
  • 【数据结构初阶】六、线性表中的队列(C语言 -- 链式结构实现队列)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【数据结构初阶】五、线性表中的栈(C语言 -- 顺序表实现栈)_高高的胖子的博客-CSDN博客  

    2024年02月08日
    浏览(31)
  • 【C语言】【数据结构初阶】 快排变慢排?怎么个事儿?

    我们知道,快排是一种很好的排序算法。但是在 极少数 的一些情况下,“快速排序”好像名不副实了。 当数据量非常大,且递归深度太深,有栈溢出的风险。 这样,我们就得到了一个很可惜的结论:快排不是万金油。 但是,这是指的 递归版本 的快排,我们可以写 非递归

    2024年02月17日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包