c语言-浅谈指针(2)

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


本篇文章是关于数组与指针的,在上一篇指针内容的基础上进一步了解指针

1.数组名的理解

我们先来了解一个知识点:在给指针变量赋值时,数组用数组名赋给指针变量相当于&arr[0]. 也就是说数组名就是数组的首地址

我们来验证一下:

int main() {
	int arr[5] = { 0 };
	printf("%p\n", arr);
	printf("%p\n", &arr[0]);
	return 0;
}

运行结果:
c语言-浅谈指针(2),c语言主要知识点,c语言,数据结构,算法,经验分享,笔记,指针

两个一样,说明了数组名就是数组的首地址

但是有两个例外:
1.就是在求数组长度时,sizeof(arr)–这里的数组名代表的是整个数组
2.就是在给数组名取地址时,&arr,这时取的时整个数组的地址

我们来验证一下:

int main() {
	int arr[5] = { 0 };
	int t = sizeof(arr);//计算数组大小
	printf("arr=%p\n", arr);
	printf("&arr[0]%p\n", &arr[0]);
	printf("&arr=%p\n", &arr);
	printf("arr+1=%p\n", arr+1);//数组内加1
	printf("&arr+1=%p\n", &arr+1);//整个数组加1
	printf("arr=%d\n", t);//打印数组大小
	return 0;
}

运行结果:
c语言-浅谈指针(2),c语言主要知识点,c语言,数据结构,算法,经验分享,笔记,指针

1.我们先分析一下数组大小,从运行结果来看计算结果为20,刚好是这个数组的大小,也验证了我们的第一条。
2.我们再来分析一下前三个结果,它们都一样,是因为这里打印的都是第一个地址,有区别的是后面两个,它们在原来数组大小的基础上加 1 ,但是结果却不同,arr+1只加了4,而&arr+1却多了20,所以可以说明&arr取得是整个数组地址

2.使用指针访问数组

有了前面得知识做铺垫,那么我们接下来来使用指针去访问数组吧
我们通过指针去访问数组是将这个数组得首地址赋给指针,再通过指针得解引用去逐个去访问数组的元素,接下来通过代码演示一下吧

int main() {
	int arr[5] = { 1,2,3,4,5 };
	int* p = arr;//给首地址
	for (int i = 0; i < 5; i++) {
		printf("%d ", *(p + i));//利用指针打印
	}
	return 0;
}

图解:
c语言-浅谈指针(2),c语言主要知识点,c语言,数据结构,算法,经验分享,笔记,指针
运行结果:
c语言-浅谈指针(2),c语言主要知识点,c语言,数据结构,算法,经验分享,笔记,指针

实质:

在编码时会将 arr [ 0 ]转化为 *(arr+0).那么p是不是也可以写成这样呢 p [0] ,答案是:是的,因为它最后也会转化为 *(p+0),那么是不是也会写成这样呢 0[arr],答案也是:是的,因为最后都会转化,那么通过代码来验证一下

int main() {
	int arr[5] = { 1,2,3,4,5 };
	int* p = arr;//给首地址
	printf("%d ", *(arr + 0));
	printf("%d ", p[1]);
	printf("%d ", 3[arr]);
	return 0;
}

运行结果:

c语言-浅谈指针(2),c语言主要知识点,c语言,数据结构,算法,经验分享,笔记,指针
耶,验证成功

补充:

当利用指针输入时不用加 * ,因为指针变量本身就是一个地址

如:

scanf("%d",p)

3.一维数组传参的本质

一维数组传参的本质就是传首地址

接下来通过代码验证一下

void  te(int arr[]) {
	int r = sizeof(arr) /sizeof(arr[0]);
	printf("r=%d\n", r);
}
int main() {
	int arr[10] = { 0 };
	int t = sizeof(arr)/sizeof(arr[0]) ;
	te(arr);
	printf("t=%d", t);
	return 0;
}

运行结果:
c语言-浅谈指针(2),c语言主要知识点,c语言,数据结构,算法,经验分享,笔记,指针

分析:

r=1说明传过去的只有1个元素,也就是说传过去的第一个元素的地址(首地址),
而t=10说明数组有10个元素,是数组全部的元素,就是说是整个数组的地址

利用指针接收数组
可以用一个指针变量接收数组(因为传的就是首地址)
如:

void  te(int *p) {
	
}
int main() {
	int arr[10] = { 0 };
	
	te(arr);
	
	return 0;
}

之后就是根据上面那样利用指针去访问数组 了

4.二级指针

指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪⾥?那就是二级指针 简单来说就是接收一级指针的

如:

int main() {
	int a=10;

	int* p = &a;
	int** pp = &p;

	return 0;
}

图解:
c语言-浅谈指针(2),c语言主要知识点,c语言,数据结构,算法,经验分享,笔记,指针

*pp 通过对pp中的地址进⾏解引⽤,这样找到的是 p , *pp 其实访问的就是 p
而 * *pp就是访问a了>>> *pp找到p>>再对p解引用 访问a

运算

//a=30
//p=&a
//*p=a
//*pp=p
**pp= 30;

5.指针数组

指针数组是指针还是数组?
我们类⽐⼀下,整型数组,是存放整型的数组,字符数组是存放字符的数组。 那指针数组呢?是存放指针的数组。

图类比
c语言-浅谈指针(2),c语言主要知识点,c语言,数据结构,算法,经验分享,笔记,指针

c语言-浅谈指针(2),c语言主要知识点,c语言,数据结构,算法,经验分享,笔记,指针

指针数组的每个元素是地址,⼜可以指向⼀块区域。

例:
指针数组模拟⼆维数组
代码实现:

#include <stdio.h>
int main()
{
 int arr1[] = {1,2,3,4,5};
 int arr2[] = {2,3,4,5,6};
 int arr3[] = {3,4,5,6,7};
 //数组名是数组⾸元素的地址,类型是int*的,就可以存放在parr数组中
 int* parr[3] = {arr1, arr2, arr3};
 int i = 0;
 int j = 0;
 for(i=0; i<3; i++)
 {
 for(j=0; j<5; j++)
 {
 printf("%d ", parr[i][j]);
 }
 printf("\n");
 }
return 0;
}

c语言-浅谈指针(2),c语言主要知识点,c语言,数据结构,算法,经验分享,笔记,指针
parr[i]是访问parr数组的元素,parr[i]找到的数组元素指向了整型⼀维数组,parr[i][j]就是整型⼀维数组中的元素。

与真正二维数组的区别
真正的二维数组的地址是连续的而指针数组模拟⼆维数组的地址是不连续的

以上就是我的分享了
谢谢大家观看,如果对你有帮助的话,点点赞和关注哦文章来源地址https://www.toymoban.com/news/detail-755830.html

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

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

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

相关文章

  • 【C】指针——知识点大全(详细,简洁,含例题)

      前言: 大家好,这里是 YY ;此篇博客主要是 指针的知识点 ;包含 【一二级指针】【字符指针】【指针数组】【数组指针】【以上知识的实际应用】【函数指针】【函数指针数组】 PS:创作不易,每个知识点都有 例题或者图 帮助理解;如果对你有帮助,希望能够得到您的

    2024年02月05日
    浏览(37)
  • 【考研易忘知识点】数据结构

    数据的逻辑结构独立于其存储结构 可以用抽象数据类型定义一个完整的数据结构 数据的运算也是数据结构的一个重要方面: 二叉树和二叉排序树的逻辑结构和物理结构完全相同,但运算效率大不相同;如查找,二叉树O(n),二叉排序树O(logn) 一个算法是问题求解步骤的描述,

    2024年02月08日
    浏览(33)
  • Java学习之数据结构知识点

    Java学习系列知识点纯干货: 1.Java学习之Java基础部分知识点—传送门 2.Java学习之Java多线程知识点—传送门 3.Java学习之数据库知识点—传送门 4.计算机网络知识点—传送门 5.Java学习之数据结构知识点—传送门 6.操作系统知识点学习—传送门 一棵深度为k的有n个结点的二叉树,

    2024年02月07日
    浏览(35)
  • 数据结构与算法期末复习——知识点+题库

    (1)数据:所有能被计算机识别、存储和处理的符号的集合(包括数字、字符、声音、图像等信息 )。 (2)数据元素:是数据的基本单位,具有完整确定的实际意义。在计算机程序中通常作为一个整体进行考虑和处理。一个数据元素可由若干个数据项组成。 (3)数据项:构成数据元

    2024年02月12日
    浏览(36)
  • 数据结构选择题练习知识点整理【3】

    n 个点连通且无环的简单无向图为连通图,连通则至少有n-1条边,无环则只有n-1条边。n个点连通且无环的简单无向图有n-1条边,非零个数为2(n-1),零元素个数为n^2-2(n-1)。得出零元素个数为n²-2n+2。 算术表达式 中缀、前缀、后缀的互相转换 中-前 从右到左 数字入栈,碰见运算

    2024年02月06日
    浏览(33)
  • Java面试知识点(全)-数据结构和算法

    Java面试知识点(全)https://nanxiang.blog.csdn.net/article/details/130640392 注:随时更新 数组 数组的下标寻址十分迅速,但计算机的内存是有限的,故数组的长度也是有限的,实际应用当中的数据往往十分庞大;而且无序数组的查找最坏情况需要遍历整个数组;后来人们提出了二分查

    2024年02月05日
    浏览(30)
  • 王道考研数据结构第五章知识点

    5.1.1 树的定义和基本术语   祖先节点:(对于你来说),父亲和爷爷都是祖先节点 子孙节点:对于父亲来说,父亲下面所有的节点都叫子孙节点 双亲节点(父节点):一个节点的直接前驱就是它的父节点  兄弟节点:例如二叔,三叔都是父亲的兄弟节点 堂兄弟节点:对于你来说,

    2024年02月15日
    浏览(34)
  • 数据结构之双链表的相关知识点及应用

     找往期文章包括但不限于本期文章中不懂的知识点: 个人主页 :我要学编程(ಥ_ಥ)-CSDN博客 所属专栏 :数据结构 目录 双链表的实现  初始化双链表  在双链表中尾插数据  在双链表中尾删数据 在双链表中头插数据  在双链表中头删数据  在双链表中的指定位置之后插入

    2024年04月26日
    浏览(25)
  • 数据结构中一些零碎且易忘的知识点

    第一章 绪论 数据结构包含三个方面的内容: 数据的逻辑结构:描述数据之间逻辑关系的、与数据的存储无关的数学模型。相同的逻辑结构可使用不同的存储结构存储,如线性表既可顺序存储,也可链式存储 线性结构:一个线性表是n个具有相同特性的数据元素的有限序列 一

    2024年02月14日
    浏览(26)
  • 数据结构之单链表的相关知识点及应用

     找往期文章包括但不限于本期文章中不懂的知识点: 个人主页 :我要学编程(ಥ_ಥ)-CSDN博客 所属专栏 :数据结构 目录 链表的概念及结构 链表与顺序表的区别与优劣势 链表的分类 单链表的实现 单链表中增加节点  单链表中尾插数据  打印单链表中节点的数据  单链表中

    2024年04月15日
    浏览(24)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包