首页 > 其他分享 >深入了解指针(2)【指针与数组】【二级指针】

深入了解指针(2)【指针与数组】【二级指针】

时间:2024-03-18 12:04:27浏览次数:19  
标签:10 int 地址 深入 数组 sizeof 指针

一.使用指针访问数组

关于数组,我在上次的博客中也提到了一些比较重要的知识点。首先就是数组名,数组名只有在两种情况下代表的是整个数组的地址,一个是在sizeof里面,一个是用&符号。

那么为什么我们可以用指针来访问数组呢?因为数组在内存中是连续存放的,只要我们找到第一个地址,那么后面的地址不也是手到擒来的吗。

我们先想一个简单的代码,先假设有一个数组a[10],这个数组的元素让我们去输入,而我想要把这十个元素按照顺序依次输入,是不是一下就可以想到咱们可以用for循环,创建一个变量i,依次递增很轻松就能写出这样一个代码。

#include <stdio.h>
int main()
{
	int a[10] = { 0 };
	int sz = sizeof(a) / sizeof(a[0]);
	for (int i = 0; i < sz; i++)
	{
		scanf("%d", &a[i]);
	}
	return 0;
}

但我如果想要用指针写呢?很简单,咱们只需要加一个整型指针的变量就行了。

#include <stdio.h>
int main()
{
	int a[10] = { 0 };
	int sz = sizeof(a) / sizeof(a[0]);
	int* p = a;
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		scanf("%d", p + i);
	}
	return 0;
}

这里for循环里的p+i的意思其实就是a[i],p指针指向的就是数组的第一个元素的地址,而加i就是每一次往后面移动几位。访问的第几个位置,如图

依次加i就能成功访问到数组的各个位置,达到输入输出的目的。这里我说一个比较有意思的东西。大家知道,表示数组里的某一个元素咱们可以直接写成a[i],当然用指针也是可以,*(a+i)或者*(i+a)。那么大家可以想一下i[a]可以吗?这里我是把i和a反过来了。用代码来看一下结果。

当然也是成功运行打印出来了结果,那么为什么i[a]可以运行出来结果呢?这里我额外说一个东西就是[],[]是一个下标引用操作符,当我们把数组写成a[i]时,就相当于是*(a+i),而写成i[a]时,就相当于是*(i+a),这只是个加法调换了一下位置而已。但是这种方法可行但是不太推荐。大家了解一下就行。

二.一维数组传参的本质

我们知道,数组是可以传递给函数的,我们可以探索一下数组传参的本质。先看一个代码:

这里我传递的是一个数组,但是只打印出来了一个0;肯定是有一个地方不对。事实上,在我们的Print函数里面的sz大小其实是1,因为我们在主函数里面给Print传递参数的时候,给它的是arr,arr是个数组名啊,除了sizeof和&其他的情况代表的都只是数组首元素的地址,所以这里就相当于只传递了一个地址,1除以1sz当然就等于1了。

在我们初学数组传参的时候,在语法的层次上讲,我们会把参数写成数组的形式就像是上面的代码int arr[10],这样我们可以更好的理解,当然这样是肯定可以的,但是其本质上还是地址,相当于我们放在这里的就只是int *arr,本质上还是指针变量。

有两点需要说一下:1.数组传参的本质是传递了数组首元素的地址,所以形参访问的数组和实参的数组是同一个数组。2.形参的数组是不会单独再创建数组空间的,所以形参的数组是可以省略掉数组大小的(简单的说,在形参里的a[10]可以写成a[])。

总结:一维数组传参,形参的部分可以写成数组的形式,也可以写成指针的形式。

三.二级指针

其实我们常用的一些指针是一级指针,比如

int main()
{
	int a = 10;
	int* p = &a;
	return 0;
}

在这里的p就是一级指针,存储的是a的地址。我们假设a的地址为0x0012ff40,此时的p里面存储的就是0x0012ff40。那么大家想,p也是一个变量啊,那么p在内存中有没有地址呢?答案是肯定有的。我再把p 的地址拿出来再赋值给一个变量pp,此时的pp就是二级指针

那么pp的类型应该就是int**,也就是int**pp=&p。那么int**我们该如何理解。

我们可以拆开理解int**,我们知道a的类型是int,p的类型是int*。

当然了大家也可以发挥想像,三级指针四级指针等等。

感谢观看,如有错误还请指正。

标签:10,int,地址,深入,数组,sizeof,指针
From: https://blog.csdn.net/2301_81699364/article/details/136662179

相关文章

  • C++中的this指针、访问控制和构造函数
    C++中的this指针、访问控制和构造函数this指针在C++中,this指针是一个特殊的指针,它指向当前对象的地址。每个非静态成员函数(包括成员函数模板)都有一个this指针作为其隐含参数,这意味着在成员函数内部,this可以用来引用调用该成员函数的对象。this指针是自动传递给成员函数的,......
  • Java学习系列(三):数组
    一、数组的基本概念及作用数组:是一组相同数据类型元素的集合,是一个容器①数组可以存储基本数据类型,也可以存储引用数据类型②数组创建时必须指定长度,且长度不可变③数组中每个元素空间是连续的声明数组格式:数据类型[]数组名字例如:int[]a;数据类型数组的名字[]......
  • 05_C++数组指针和指针数组
    1.数组指针:当数组指针指向一个一维数组时,()优先级高,说明p是指针,指向一个整型的一维数组。这个一维数组的长度是n,也可以说p的步长为n。当p+1时,p指针会跨过n个整型数据的长度。2.指针数组:当定义一个一维数组时,系统会在内存中为改数组分配一个储存空间,其数组的变量名就是数组的首地址......
  • 2.3C++对象模型和this指针
    1、成员变量和成员函数分开存储在C++中,类内的成员变量和成员函数分开存储只有非静态成员变量才属于类的对象上空对象占用内存空间为1。C++编译器会为每个空对象也分配1个字节的空间,是为了区分空对象占内存的位置。每个空对象也应该有一个独一无二的内存地址。calssPerson{......
  • 深入浅出计算机网络 day.3 第二章 物理层
    一定要把你在意的东西看得淡一点,再淡一点,有些事情有些人,只要你不那么在乎了,就不会伤害到你                                                         ......
  • 「深入理解Java I/O:FilterInputStream」
      咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java之IO流啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~前言  JavaI/O是Java编程语言的核心功能之一,提供了丰富的输入输出操作......
  • 一.深入指针(一)
    指针的学习是C语言中最难的,也是最重要的。最重要的一点就是:指针=地址特别的,指针特有的符号就是:*&(取地址符号)指针变量的表达式为:这只是最简单的指针变量,也是基础。解引用操作符:上述的例子中,其实已经给出了解引用操作符的表达式就是:对于指针的学习,还有一个重要的知识点就是co......
  • 一.深入指针(二)
    前面已经学习了如何创建整形指针,创建整形指针的形式有哪些。那么,今天呢,我们就来讲一讲指针数组是如何创建的。在了解指针数组之前,先了解什么是数组名吧。数组名:就是数组⾸元素(第⼀个元素)的地址。这里有一段代码来体会一下数组名到底是什么意思吧,代码:三个打印,就有三种不同的......
  • js数组循环常用的几种方法
    前端开发中,经常要用到循环,保存一份,后面慢慢补充。js数组循环常用的几种方法:。1、for循环最基本的循环方式,也是速度比较快,效率比较高的循环方式,vararr=[1,2,3,4,5];for(vari=0;i<arr.length;i++){ console.log(arr[i]);}2、forEach循环历数组中的每一......
  • 数组基础使用
    关于数组①数组定义之后大小不能改变②数组内元素数据类型相通不允许出现不同类型③数组内的元素可以是任何数据类型包括基本数据类型和引用数据类型④数组变量属于引用类型,数组也可以看做是对象,数组的每个元素的相当于这个对象的成员变量⑤数组本身是对象Java中对象是在......