【C语言】指针篇-深入探索数组名和指针数组- 必读指南(2/5)

这篇具有很好参考价值的文章主要介绍了【C语言】指针篇-深入探索数组名和指针数组- 必读指南(2/5)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【C语言】指针篇-深入探索数组名和指针数组- 必读指南(2/5),C语言,c语言,开发语言,学习,c++

🌈个人主页:是店小二呀
🌈C语言笔记专栏:C语言笔记
🌈C++笔记专栏: C++笔记

🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅
【C语言】指针篇-深入探索数组名和指针数组- 必读指南(2/5),C语言,c语言,开发语言,学习,c++


【C语言】指针篇-深入探索数组名和指针数组- 必读指南(2/5),C语言,c语言,开发语言,学习,c++

认识指针与数组之间的关系(涉及二级指针)


数组名

在数组篇章,我们得到一个结论:数组名是首元素的地址

验证环节:

#include <stdio.h>
int main()
{
    int nums[]={1,2,3};
    printf("&nums[0] = %p\n", &nums[0]);
	printf("nums = %p\n", nums);
    return 0;
}

结果:
&nums[0] = 00D6F724
 nums[0] = 00D6F724  

问题:既然数组名是首元素的地址,那么为什么下面输出却不是预想的结果呢?

int main()
{
    int nums[10]={1,2,3};
    printf("%d\n",sizeof(nums));
    return 0;
}
输出结果:40。数组名是数组首元素的地址的话,那么输出的结果为什么不是4/8呢?

解释:首先数组名是首元素的地址这结论是没错的,但是凡是都有特例

  • sizeof(array_name)sizeof单独放数组名,这里的数组名表示整个数组,计算的是整个数组的大小
  • & array_name这里的数组名表示整个数组,取出的是整个数组的地址(整个数组的地址和数组首元素的地址是有区别的,虽然一开始指向的地址是相同的)
#include <stdio.h>
int main()
{
int nums[10] = { 1,2,3,4,5,6,7,8,9,10 };
printf("&nums[0] = %p\n", &nums[0]);
printf("&nums[0]+1 = %p\n", &nums[0]+1);
printf("nums = %p\n", nums);
printf("nums+1 = %p\n", nums+1);
printf("&nums = %p\n", &nums);
printf("&nums+1 = %p\n", &nums+1);
return 0;
}

通过结果得到的结果:

  1. &nums[0]和(nums)&nums[0]+1 和(nums)+1相差了四个字节
  2. &nums&nums+1相差40个字节

理由:根据上面的结论

  1. &nums[0]和(nums)都是代表首元素的地址,对此+1只跳过一个元素(数组元素)

  2. &nums都是代表整个数组的地址,对此+1只跳过一个元素(整个数组)

指针访问数组

int nums[]={1,2,3};
int *p=nums;
printf("%d",*(p+1));//p[1]=nums[1]=*(nums+1)

说明:
本质上nums[i]等价于*(nums+i),在编译器处理时,数组通过下标访问是转换成首元素的地址+偏移量求出元素的地址,再解引用来访问的。

一维数组传参

问题:将外部函数中数组在调用函数时传参,并在内部函数求数组元素个数是否可行?

void test(int nums[])
{
    int sz=sizeof(nums)/sizeof(nums[0]);;
    printf("%d",sz);//结果为1
}
int main()
{
    int nums[]={1,2,3,4,5};
    test(nums);
    return 0;
}

结果:在函数内部没有求出正确的数组元素个数。

理由:因为数组名是数组首元素的地址,那么在数组传参的时候,传过去的不是一整个数组,而是数组名,也是说数组传参的本质是传递数组首元素的地址,地址的大小4/8

结论:

  • 在求数组元素个数的操作在调用函数前完成
  • 一维数组传参,形参部分可以写成数组的形式(本质是指针),也是可以写成指针的形式
数组形式:void test(int nums[])
指针形式: void test(int *nums)

二级指针

问题:指针变量是存放变量的地址,是变量就是有自身的地址,那么指针变量的地址存放在哪里呢?

int *类型存放int 类型地址
int **类型存放int *类型地址 
    依次类推

二级指针:用于存放一级指针的地址,以此类推,N级存放N-1级的地址,但是太高级也是不常用或者直接不用三级以上的

分析:

【C语言】指针篇-深入探索数组名和指针数组- 必读指南(2/5),C语言,c语言,开发语言,学习,c++


对于二级指针的运算

*pa是通过pa中的地址解引用,找到的是a( * pa通过a的地址找到a)

int a=10;
*pa = &a;//等价pa = &a

**ppa是先通过 *ppa找到pa,然后对pa进行解引用找到a:( *pa,找到a)

** ppa = 10;
//等价* pa = 10;
//等价a = 10

【C语言】指针篇-深入探索数组名和指针数组- 必读指南(2/5),C语言,c语言,开发语言,学习,c++


指针数组

问题:指针数组是指针还是数组

整型数组:存放整形的数组
字符数组:存放字符的数组
.....
指针数组:存放指针的数组(每个元素的都是存放地址)(而指针又指向一块空间)


```cpp
int a, b, c=0;
int* arr[5] = {&a, &b, &c};
这里arr先跟[]结合形成数组,意味是指针数组,存放一级指针的数组

顺序问题:先对外层解引用,在到内部解引用

指针数组模拟二维数组

int main()
{
	int arr1[] = {1,2,3,4,5};
	int arr2[] = {2,3,4,5,6};
	int arr3[] = {3,4,5,6,7};	
    //[]优先级高于* p先是个数组,所以是数组指针
    //P里面的元素都是地址(指针)
	int* parr[] = { arr1,arr2,arr3};
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			printf("%d ", parr[i][j]);
		}
		printf("\n");
	}

	return 0;
}

【C语言】指针篇-深入探索数组名和指针数组- 必读指南(2/5),C语言,c语言,开发语言,学习,c++

说明:parr[i]是访问parr数组的元素{arr1,arr2,arr3},而这些是指针(地址),同时指向一片空间,需要再次解引用找到某指针的某个元素。对于上面parr[i]找到的数组元素指向了整形一维数组,p[i] [j]就是整形一维数组中元素

注意:属于模拟二维数组的效果,二维数组也是连续存放数据的,而这里每一行不是连续存放,不是真正的二维数组


【C语言】指针篇-深入探索数组名和指针数组- 必读指南(2/5),C语言,c语言,开发语言,学习,c++

谢谢大家的观看,这里是个人笔记,希望对你学习C有帮助。
如果对指针篇感兴趣可以,点击该链接了解多方面学习指针开篇文章来源地址https://www.toymoban.com/news/detail-860612.html

到了这里,关于【C语言】指针篇-深入探索数组名和指针数组- 必读指南(2/5)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • C 语言指针完全指南:创建、解除引用、指针与数组关系解析

    我们可以使用引用运算符 获取变量的内存地址: 指针是一个将另一个变量的内存地址作为其值的变量。 指针变量指向一个数据类型(如 int )的相同类型,并使用 * 运算符创建。您正在使用的变量的地址被分配给指针: 示例解释: 创建一个名为 ptr 的指针变量,指向一个 i

    2024年02月03日
    浏览(51)
  • C语言指针(适合C语言进阶者):一道题带你深入理解数组与指针的关系

    🎈个人主页:JAMES别扣了 💕在校大学生一枚。对IT有着极其浓厚的兴趣 ✨系列专栏目前为C语言初阶、后续会更新c语言的学习方法以及c题目分享. 😍希望我的文章对大家有着不一样的帮助,欢迎大家关注我,我也会回关,大家一起交流一起互动,感谢大家的多多支持哈! 🎉

    2024年04月16日
    浏览(49)
  • 【Go 基础篇】深入探索:Go语言中的二维数组

    在计算机编程中,数组是一种基本的数据结构,用于存储相同类型的元素。而二维数组作为数组的一种扩展,允许我们以类似表格的方式存储和处理数据。在Go语言中,二维数组是一个重要的概念,本文将深入探讨Go语言中的二维数组,包括定义、初始化、遍历以及应用场景等

    2024年02月10日
    浏览(39)
  • 掌握指针进阶:探索字符指针、数组指针和指针数组的妙用

    💓博客主页:江池俊的博客 ⏩收录专栏:C语言进阶之路 👉专栏推荐:✅C语言初阶之路 ✅数据结构探索 💻代码仓库:江池俊的代码仓库 ​🎪 社区:GeekHub社区 ​ 🎉欢迎大家点赞👍评论📝收藏⭐ 指针的主题,其实我在初阶指针《【C语言】指针----初阶》章节就已经接讲

    2024年02月12日
    浏览(34)
  • 开发者必读指南:必须知道的关键性能指标,提升代码性能

    在Web应用程序的开发过程中,性能是一个至关重要的问题。高性能的Web应用程序需要快速响应,并能够处理大量的并发请求。而为了评估Web应用程序的性能状况,我们需要关注一些关键的性能指标。本文将介绍一些常见的Web项目性能指标及其意义。 1)请求响应时间 请求响应

    2024年02月07日
    浏览(49)
  • 【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(Docker-compose使用全解 一)

    Docker Compose是一款用于定义和运行复杂应用程序的Docker工具。在使用Docker容器的应用中,通常由多个容器组成。使用Docker Compose可以摆脱使用shell脚本来启动容器的繁琐过程。 Compose通过一个配置文件来管理多个Docker容器。在配置文件中,我们使用services来定义所有的容器。然后

    2024年01月17日
    浏览(68)
  • 【C语言进阶】指针数组 —— 数组指针

    🎬 鸽芷咕 : 个人主页  🔥 个人专栏 : 《C语言进阶篇》 《C语言初阶篇》 ⛺️生活的理想,就是为了理想的生活!    🌈 hello! 各位宝子们大家好啊,前面我们已经把指针大部分内容给学完了,今天就给大家带来数组指针or指针数组!    ⛳️ 很多说这俩名字不是差不

    2024年02月14日
    浏览(34)
  • C语言 ——指针数组与数组指针

    目录 一、二维数组 二、指针数组 (1)概念  (2)书写方式 (3)指针数组模拟二维数组 三、数组指针 (1)概念 (2)使用数组指针打印一维数组  (3)模拟二维数组的传参 首先,我们要理解一下二维数组和指针变量之间的一些相关概念。 二维数组 : int arr [ 3 ][ 5 ]  

    2024年02月13日
    浏览(48)
  • C语言--指针详解(下)--字符指针、数组指针、指针数组、函数指针、函数指针数组(转移表)

    在C语言中有一种指针类型为字符指针 char*,常用其来表示字符,使用如下: 除了上述用法之外,还可以有以下的用法: 在上面的代码中,字符 \\\" hello word \\\"是常量字符串,将\\\"hello word\\\"放入 pstr 指针的实质是将第一个字符 “ h \\\" 的地址传递给了 pstr ,通过首字符 ” h \\\" 就可以访问

    2024年02月03日
    浏览(46)
  • 【go语言基础】指针数组和数组指针

    (1)指针数组: 存储指针的数组,也叫存储地址的数组,简单说就是存储地址的。 首先它是一个数组,数组中的元素都是指针(地址)。 (2)数组指针: 首先它是一个指针,存储的是指向数组的指针。 (1)指针数组 定义: 注意:首先是一个数组,将数组中的元素定义为

    2024年02月13日
    浏览(51)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包