前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >指针与数组区别演示

指针与数组区别演示

作者头像
From Zero
发布2021-02-22 11:16:43
2690
发布2021-02-22 11:16:43
举报
文章被收录于专栏:C语言

指针与数组

引言:

指针与数组是C语言中的重要组成部分,它们不一样却又有着紧密的联系。下面将用几个代码例子展示它们的关系。

测试代码:
代码语言:javascript
复制
#include 
#include 
int main(void){
	
	
	// 一维数组 
	printf("Size of int: %d(byte)\n", sizeof(int));
	printf("Addresses of array\n");
	int arr[3] = {1, 2, 3}, i, j;
	for(i = 0; i < 3; i++){
		printf("%d:\t%d\n", arr + i, *(arr + i));
	}
		
	// 二维数组
	printf("Addresses of two dimensional array\n");
	int mat[2][3] = {1, 2, 3, 4, 5, 6};
	int *p = mat;
	printf("%d:\t%d\n", &p, p);
	for(i = 0; i < 6; i++){
		printf("%d:\t%d\n", p+i, *(p+i));
	} 

 	// 一维指针
 	printf("Addresses of one dimensional pointer\n");
	p = (int*) malloc(sizeof(int) * 4);
	printf("%d:\t%d\n", &p, p);
	for(i = 0; i < 4; i++){
		*(p + i) = i;
	}
	for(i = 0; i < 4; i++){
		printf("%d:\t%d\n", p+i, *(p+i));
	}
	
	// 二维指针
	printf("Addresses of two dimensional pointer\n");
	int** ptr = (int**) malloc(sizeof(int*) * 4);
	printf("%d:\t%d\n", &ptr, ptr);
	for(i = 0; i < 4; i++){
		*(ptr + i) = (int*) malloc(sizeof(int) * 2);
	}
	for(i = 0; i < 4; i++){
		for(j = 0; j < 2; j++){
			*(*(ptr+i) + j) = i * 2 + j;
		}
	}
	for(i = 0; i < 4; i++){
		printf("%d:\t%d\n", ptr + i, *(ptr + i));
	}
	printf("==\n");
	for(i = 0; i < 4; i++){
		for(j = 0; j < 2; j++){
			printf("%d:\t%d\t%d\n",*(ptr + i) + j, *(*(ptr + i) + j), ptr[i][j]);
		}
		printf("==\n");
	}
	// 下面的程序是必须的,否则内存泄漏,导致内存占用过多 
	free(p);
	for(i = 0; i < 4; i++){
		free(*(ptr + i));
	} 
	free(ptr);
	  
	return 0;
}
输出:
代码语言:javascript
复制
Size of int: 4(byte)
Addresses of array
6487584:        1
6487588:        2
6487592:        3
//可以看到每个元素的地址值依次加4(一个int的大小),这里数组名加元素序号直接指向该元素的地址

Addresses of two dimensional array
6487544:        6487552
6487552:        1
6487556:        2
6487560:        3
6487564:        4
6487568:        5
6487572:        6
//输出的第一个地址&p,是指针所在的地址,第二个地址p才是指针中存放的地址,即指针指向的地址。
//可以看到在二维数组中,元素们也是挨着存放的

Addresses of one dimensional pointer
6487544:        11824256
11824256:       0
11824260:       1
11824264:       2
11824268:       3
//一维指针,可以看出和一维数组的情况基本一样

Addresses of two dimensional pointer
6487536:        11824288//这里的指针本身所在地址和它存下的地址不同,正如前面所演示的
11824288:       11824336
11824296:       11824368
11824304:       11824400
11824312:       11824432
//这里二维数组中每个指向一维数组的指针,它们所在的位置是挨着的,因为指针所占大小为8;而它们指向的地址并不相邻 (没有规定这个应该是相邻的!)
==
11824336:       0       0
11824340:       1       1
//可见二维数组中的每一个一维数组的存储方式和上面例子的演示一样
==
11824368:       2       2
11824372:       3       3
==
11824400:       4       4
11824404:       5       5
==
11824432:       6       6
11824436:       7       7
==
//总结:二维指针的存储形态与二维数组出现了差别。二维数组中依然是每个元素挨着放置存储,而二维指针(把它看成是一个存了 指向一维数组的指针 的一维数组),
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/02/03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 指针与数组
    • 引言:
      • 测试代码:
        • 输出:
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档