区块链技术博客
www.b2bchain.cn

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

这篇文章主要介绍了C语言中一二维数组与指针的内存地址区别的讲解,通过具体代码实例进行19486 讲解,并且分析了C语言中一二维数组与指针的内存地址区别的详细步骤与相关技巧,需要的朋友可以参考下https://www.b2bchain.cn/?p=19486

本文实例讲述了2、树莓派设置连接WiFi,开启VNC等等的讲解。分享给大家供大家参考文章查询地址https://www.b2bchain.cn/7039.html。具体如下:

目录

    • 一、简介
        • 1、malloc函数
        • 2、调试指针变量的方法
          • (1)一维指针
          • (2)二维指针
    • 二、一维数组与指针,二维数组与指针的区别

一、简介

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
*[email protected]_size
下面举个例子
左边的局部变量对于p指针只能显示他的第一个值,当我们在监视中添加后可以像一维数组一样观察到他的所有值

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

(2)二维指针

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

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

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

  在了解上面内容以后,我们观察一维数组,二维数组,一维指针和二维指针在内存中的区别,由于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]之间的内存空间并不连续。
C语言中一二维数组与指针的内存地址区别

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

本文转自互联网,侵权联系删除C语言中一二维数组与指针的内存地址区别

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » C语言中一二维数组与指针的内存地址区别
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们