不懂指针数组和数组指针? 迷了一天的我终于明白了!!!一旦你对内存了解的更多,不美观的代码就看起来美

大家好,我是 DongGu ,是一名软件工程专业大二的学生,写博客一方面是为了记录自己的学习过程,把自己犯的错误进行分享。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!有任何问题可以评论或者QQ联系(1521839703),我的博客,还在优化中

最近在往c的指针去学习,在这里分享我的思考哟;


ps:这里的排版可能有点问题,因为我是边实践边打出自己的的理解,如果看得不舒服,可以直接复制最后的代码部分,在相应的地方都有注释和思考

数组指针:

例如(int* p[3]) ,数组类型的指针, 使用指针的一维数组
  1. 可以这样想 a是一个一维数组, 数组名代表其首地址, 我是这么看的, 可不可以把a当做一个指针呢?

    我们去访问一维数组时,

    可以    ------> a[1],a[2]…a[n]访问,
    其实也可以 ------> *(a + 1), *(a + 2), *(a + n)

  2. 那么现在有一个数组, 它的类型是int*; 怎么解释呢?

    • p[0] 等价于 这个0位置的内容 换做上面 p+0找到了这个地方的地址,怎么去更新它的内容呢? 所以就要用到解引用
      *(p+0) = &___  <------>  p[0] = &___

    • p[0] 是指针, 其内容是地址!!!
      那么既然内容已经更新了, 访问不就简单了,在内容上再解引用
      *( *(p+0))…

    • 剩下p[1],p[2]… 同理咯~

    • 所以 这个[], 我们可以假想成有一个 (寻址 + 解引用)的功能, 这里好像汇编上有讲过,准备去补补


指针数组 :

(int(*q)[4]) 指向数组的指针
  1. 其实怎么说吧? 就我自己实现,数组指针其实也可以有指针数组那样的功能, 可以运行text1()函数的代码…

  2. 算了, 还是回味一下 !

  3. q 是一个指针类型, 指向什么? 一个一维数组s1[]
    如果q = &s1, 那么你们说q + 1 = ?

    答案不是s[1], 而是一个未定义的一个地方,看图吧~ 如果这里明白了,那么理解二维数组就容易啦

在这里插入图片描述

  1. 那么现在怎么去得到值呢

    q = s了, s[0] = *(s + 0)
    所以 *q + i = s + i;
    那么最后答案就是 ------>  *(*q+i);

在这里插入图片描述

  1. 看到这里二维还难?
    ((p+i) + j) = a[i][j];

我的测试草稿

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;

int s[3] = { 0,1,2 };
int s1[4] = { 0,1,2,3 };
int a[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };

int(*q)[4];

/*
* # 数组指针: (int* p[3]) 数组类型的指针, 使用指针的一维数组
* 
	可以这样想  a是一个一维数组, 数组名代表其首地址, 我是这么看的, 可不可以把a当做一个指针呢?

	我们去访问一维数组时,
	可以	      ------>   a[1],a[2]......a[n]访问,
	其实也可以 ------>   *(a + 1), *(a + 2), *(a + n)

	那么现在有一个数组, 它的类型是int*; 怎么解释呢?
	
	- p[0] 等价于 这个0位置的内容 换做上面  p+0找到了这个地方的地址,怎么去更新它的内容呢? 所以就要用到解引用
	  *(p+0) = &___  <------>  p[0] = &___
	  
	- p[0] 是指针, 其内容是地址!!!
	  那么既然内容已经更新了, 访问不就简单了,在内容上再解引用
	  *(*(p+0))...
	  
	- 剩下p[1],p[2]... 同理咯~

	- 所以 这个[], 我们可以假想成有一个 (寻址 + 解引用)的功能, 这里好像汇编上有讲过,准备去补补

----------------------------------------------------------------------------------------------------------------------------

* # 指针数组 (int(*q)[4]) 指向数组的指针
	- 其实怎么说吧? 就我自己实现,数组指针其实也可以有指针数组那样的功能,可以运行text1()函数的代码看看....
	- 算了, 还是回味一下
	  q 是一个指针类型, 指向什么? 一个一维数组s1 
	  - 如果q = &s1, 那么你们说q + 1 = ? 
		答案不是s[1], 而是一个未定义的一个地方,看图吧~  如果这里明白了,那么理解二维数组就容易啦

	  - 那么现在怎么去得到值呢?
	    q = s了, s[0] = *(s + 0)
		所以 *q + i = s + i;

		那么最后答案就是------>  *(*q+i);


	看到这里二维还难?
	*(*(p+i) + j) = a[i][j];
*/


void text1()
{
	for (int i = 0; i < 3; i++)
	{
		printf("a[%d]----%p\t", i, a[i]);
		for (int j = 0; j < 4; j++) printf("%p\t", &a[i][j]);
		printf("\n");
	}

	int* p[3];			// 类似于有3个指针   *p0  *p1  *p2
	for (int i = 0; i < 3; i++)
	{
		*(p + i) = *(a + i);  // p[1] -> a[1] .....(0,1,2,3)
		printf("%d:  (p + i): %p   *(p + i): %p\n", i, p + i, *(p + i));
	}

	// 版本1 来遍历二维数组
	printf("\n版本1\n");
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 4; j++) {
			printf("%d\t", *(*(p + i) + j));
		}
		printf("\n");
	}

	// 版本2 来遍历二维数组
	printf("\n版本2\n");
	int* p2;
	for (int i = 0; i < 3; i++) {
		p2 = *(a + i);
		for (int j = 0; j < 4; j++) {
			printf("%d\t", *(p2 + j));
		}
		printf("\n");
	}
}

void text2()
{
	q = &s1;

	for (int i = 0; i < 4; i++) {
		printf("s1 + %d:  %d\t%p\n", i, *(s1 + i), s1 + i);
	}
	cout << "-------------\n";

	for (int i = 0; i < 4; i++) {
		//cout << *(*q + i) << "\n";
		printf("i = %d\t%d\t%p\n", i, *(*q + i), *q + i);
	}
}

int main()
{
	text1();
	text2();
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DongGu.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值