C语言中一二维数组与指针的内存地址区别

一、简介

1、malloc函数
/* 
	函数返回一个指针,指向已分配的内存大小,若返回失败为NULL
	size_t为所分配的内存的数据类型,size为内存块大小
*/
void *malloc(size_t size)

例如我想分配一个空间,可以存储连续10个int变量

int *p;
p = (int *)malloc(sizeof(int) * 10);
2、调试指针变量的方法
(1)一维指针

可以用如下方法
*(int(*)[array_size])some_pointer
*some_pointer@array_size
下面举个例子
左边的局部变量对于p指针只能显示他的第一个值,当我们在监视中添加后可以像一维数组一样观察到他的所有值

在这里插入图片描述

(2)二维指针

二维指针和一维指针类似,这里直接列举一个例子,直接看监视中的变化即可

在这里插入图片描述

二、一维数组与指针,二维数组与指针的区别

  在了解上面内容以后,我们观察一维数组,二维数组,一维指针和二维指针在内存中的区别,由于vscode中不易于观察内存,我们选择Visual Studio

实验代码如下

#include <stdio.h>
#include <stdlib.h>
int main()
{
	int i, j;
	int a[5] = { 1,2,3,4,5 };
	int b[5][5] = { { 1,2,3,4,5 },{ 6,7,8,9,10 },\
	{ 11,12,13,14,15 },{ 16,17,18,19,20 },{ 21,22,23,24,25 } };
	int *aa = (int *)malloc(sizeof(int) * 5);
	int **bb = (int **)malloc(sizeof(int *) * 5);
	for (i = 0; i < 5; i++)
	{
		aa[i] = i + 1;
	}
	//bb是一组指向整数数据指针,是一个二维指针,定义时,编译器并不对其进行内存的分配,若不进行内存分配会报错,需要人为进行内存的分配与释放。
	for (i = 0; i<5; i++)
	{
		*(bb + i) = (int*)malloc(sizeof(int) * 5);
	}

	for (i = 0; i < 5; i++)
	{
		for (j = 0; j < 5; j++)
			bb[i][j] = i*5  + j+1;
	}
	for (i = 0; i < 5; i++)
	{
		for (j = 0; j < 5; j++)
			printf("%d ", bb[i][j]);
		printf("\n");
	}
	free(aa);
	free(bb);
	return 0;
}

在例子中,我们有一个一维数组a,一维指针aa,二维数组b,二维指针bb。
从监视中我们可以发现,a的数据a[0]\—a[4]占据了连续的内存空间,同理b的数据b[0][0]\—b[4][4]也占据了连续的内存空间(b[0]\地址为0x004ffbf4,b[1]的地址为0x004ffc08,正好相差sizeof(int) * 5 = 20个字节)
我们再来看一维指针aa和二维指针bb,其中aa和a相同,也占据了连续的内存空间;而我们对二维指针bb的起始地址开始观察连续的25个int内存时,我们发现只有前五个数据时正确的{1,2,3,4,5},其余的不正确,由此我们对bb+1继续观察发现能够得到{6,7,8,9,10},观察发现bb+1的内存地址为0x0079fcb8,而连续的内存空间本应该为0x0079fc78+20=0x0079fc8c,二者不相等,由此我们可以得出二维指针bb中每一行的内存空间是连续的,即bb[i]所指的空间连续,但是bb[i]之间的内存空间并不连续。
在这里插入图片描述

在实验过程中发现malloc分配的指针无法进行修改,例如int *p =(int *)malloc(sizeof(int) * 10),无法执行p++操作。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值