指针详解(三)

本文详细讲解了数组名作为指针的概念,以及如何利用指针访问数组,包括一级指针、二级指针和指针数组与数组指针的区别。还涉及了字符指针和二维数组传参的实例,以及易混淆的内存地址理解。
摘要由CSDN通过智能技术生成

上一章介绍了一些关于简单的指针的知识,这一章介绍一些指针与数组结合的知识

一、数组名的理解:
其实数组名就是一个指针,它所指向的是数组首元素的地址
在这里插入图片描述
这里很清楚地看到两个地址一摸一样。

二、数组名可以指向首元素地址,也可以指向整个数组,那么怎么区别呢?
其实数组名代指整个数组的情况只有两种:
(1)sizeof(数组名),这里数组名代指整个数组,计算数组的大小,单位是字节。
(2)&数组名,这里的数组名也代指整个数组,取出的是整个数组的地址,打印出的地址虽然也指向首元素地址,但是若是&数组名+1,跳过了整个数组。
在这里插入图片描述
三、上面我们介绍了数组名就是指针,那么我们怎样利用指针来访问数组呢?
在这里插入图片描述

当我们理解了arr的地址时,我们就可以使用p[i]来访问这个数组。
在这里插入图片描述
由上面的运行结果可知printf("%d “, * (p+i))与printf(”%d ", p[i])的效果是一样的,也就是 * (p+i)==p[i]。

四、二级指针:
之前我们所介绍的全都是一级指针,在这里我介绍下二级指针,我们寄存地址用的是一个指针变量,指针变量也是变量,那么指针变量的地址存放在哪里?—这里就需要用到二级指针。
在这里插入图片描述
这里的pp就是一个二级指针。
二级指针解引用得到一级指针–例如char ** pp;*pp得到p,*p得到a的值,**pp也可以得到a的值。
在这里插入图片描述
五、指针数组与数组指针

(一)指针数组:
指针数组是指针还是数组?
我们类⽐⼀下,整型数组,是存放整型的数组,字符数组是存放字符的数组。
那指针数组呢?是存放指针的数组。
在这里插入图片描述
指针数组的每个元素是地址,又可以指向一块区域。
那我们是不是可以用指针数组模拟一个二维数组啊!例如int arr[i][j],arr[i]就是每一行首元素地址,我们可以将arr[i],传给这样一个数组指针。
在这里插入图片描述
在这里插入图片描述
(二)数组指针:
指针数组是⼀种数组,数组中存放的是地址(指针)。数组指针变量是指针变量?还是数组?答案是指针变量。
之前我们学过字符型指针变量,整形指针变量:
char* p,p中存放的是字符的地址,能够指向字符的指针变量;
int* p,p中存放的是整形变量的地址,能够指向整形数据的数组;

那么数组指针同理,例如整形数组指针—int( * p)[10],p存放的是一个有着10个元素的数组的地址,即首元素的地址。
从上文可以看到数组指针与指针数组非常的相似,所以我们需要理解记忆,防止用错。那么我们如何区分呢?
p先和 * 结合,说明p是⼀个指针变量变量,然后指着指向的是⼀个⼤⼩为10个整型的数组。所以
p是⼀个指针,指向⼀个数组,叫 数组指针。[]的优先级要⾼于*号的,所以必须加上()来保证p先和 * 结合,这就是指针数组。

(三)数组指针的初始化:
我们需要存放一个数组的地址,那我们就需要一个数组指针的变量:
在这里插入图片描述
(四)有了数组指针,那么我们就可以理解二维数组传参的本质了。

#include<stdio.h>

void test(int arr[3][3], int a, int b)
{
	for (int i = 0; i < a; i++)
	{
		for (int j = 0; j < b; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
}

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

这里是过去我们所采用的二维数组传参,下面我就用数组指针来实现上面这个代码:
在这里插入图片描述
总结:⼆维数组传参,形参的部分可以写成数组,也可以写成指针形式。

六、字符指针变量
这一部分虽然较为简单,但我认为也是极易出错的:
在这里插入图片描述
这个代码是将a的地址给p;
在这里插入图片描述
那们我们是否可以理解在这个代码中,字符串放入了p中?显然这种理解是错误的,但是本质是把字符串 hello world!⾸字符的地址放到了p中。

那了解这个有什么用呢?
在《剑指offer》中收录了⼀道和字符串相关的笔试题,我们⼀起来学习⼀下:

#include<stdio.h>

int main()
{
	char str1[] = "hello bit.";
	char str2[] = "hello bit.";
	const char* str3 = "hello bit.";
	const char* str4 = "hello bit.";
	if (str1 == str2)
		printf("str1 and str2 are same\n");
	else
		printf("str1 and str2 are not same\n");
	if (str3 == str4)
		printf("str3 and str4 are same\n");
	else
		printf("str3 and str4 are not same\n");
	return 0;
}

你先根据上面我介绍的知识来尝试下这道题,在下面我会给出结果!
在这里插入图片描述
这一篇博客介绍的是指针与数组结合的知识。下一篇会继续介绍进阶指针的知识。

  • 37
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值