前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言 二维数组和指针的一些笔记

C语言 二维数组和指针的一些笔记

作者头像
小锋学长生活大爆炸
发布2020-09-28 12:31:55
1.5K1
发布2020-09-28 12:31:55
举报


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二维数组

代码语言:javascript
复制
char a[5][24] = {0};
printf("%p\r\n", a);
printf("%p\r\n", a[0]);
printf("%p\r\n", *a);
printf("%p\r\n", &a[0][0]);
printf("%d\r\n", sizeof(a));
printf("%d\r\n", sizeof(a[0]));
printf("%d\r\n", sizeof(*a));
printf("%d\r\n", sizeof(&a[0][0]));
printf("%d\r\n", sizeof(a[0][0]));

output:
0x7ffd4b518aa0
0x7ffd4b518aa0
0x7ffd4b518aa0
0x7ffd4b518aa0
120
24
24
8
1
  • a=&a[0],a[0]=&a[0][0]
  • sizeof(a):表示整个二维数组的大小
  • sizeof(a[0]):表示第一行的一维数组的大小
  • sizeof(*a)*a=a[0],同sizeof(a[0])
  • sizeof(a[0][0]):表示a[0][0]这个元素的大小
  • sizeof(&a[0][0]):表示地址的大小
  • 一个指针32位机器上占4字节,在64位机器上占8字节
在这里插入图片描述
在这里插入图片描述
  • int a[5][5]:二维数组
  • char **p:二维指针
  • int (*p)[10]:一个指针,指向有10个元素的数组,也称指针
  • int* p[10]:一个数组,数组内每个元素都是指针

二维数组名不能传递给二级指针

二维数组二级指针没有直接关系。

代码语言:javascript
复制
int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};
int* *p = NULL;
p = (int**)a;       /* 不做强制类型转换会报错 */
  • p是二级指针,它首先是一个指针,指向一个int*
  • a是二维数组,它首先是一个指针,指向一个含有4个元素的int数组;
  • ap类型不相同,赋值操作需要强制类型转换
  • p=a[0]=&a[0][0],*p=a[0][0]=0
  • 访问**p的值报错,因为你访问了地址为0的空间,而这个空间你是没有权限访问的

数组名的含义

- 对于一维数组:

代码语言:javascript
复制
int arr[5]={1,2,3,4,5};
int (*p1)[5] = &arr;
/*下面是错误的*/
int (*p2)[5] = arr;

&arr是指整个数组的首地址,而arr是指数组首元素的首地址,虽然所表示的意义不同,但二者之间的值却是相同的。

赋值符号=号两边的数据类型必须是相同的,如果不同,则需要显示或隐式类型转换。在这里,p1p2 都是数组指针,指向的是整个数组。p1 这个定义的=号两边的数据类型完全一致,而p2 这个定义的=号两边的数据类型就不一致了(左边的类型是指向整个数组的指针,而右边的数据类型是指向单个字符的指针),因此会提示错误信息。

- 对于二维数组:

代码语言:javascript
复制
int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};

a[0]该列的首地址&a[0][0]a整个数组的首地址a = a[0] = &a[0][0],值相同,但意义不同。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-09-25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 二维数组
  • 二维数组名不能传递给二级指针
  • 数组名的含义
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档