C语言使用技巧:数组的下标可以是负数|一个字节可以保存多个数据

描述

01数组的下标可以是负数

C语言中使用数组,一般来说都是这样的:

int a[5] = {1, 2, 3, 4, 5};
a[0] = 10;
语法规定,数组的长度必须是个常量,保证数组所占的内存大小不变。数组下标从 0 开始,依次往后递增。于是大部分同学都把它当作了默认的规则。 其实,数组的长度可以是0,叫做柔性数组,目的是让结构体变成可变长度,可以参考下面的文章: 数组的长度为0会怎样? 第二个,数组的下标也可以是负数,正数表示向后访问,负数表示向前访问。比如:
int a[5] = {1, 2, 3, 4, 5};
int *p = &a[2];
p[-2] = 0;
  如果不太明白,可以看下下面的图片:

数据  

对于二维数组,同样可以使用小于0的下标来访问元素。
int array[3][3] = {{1, 2, 3}, {2, 3, 4}, {3, 4, 5}};
int (*p)[3] = array + 2;
printf("%d
", p[-1][-1]);
  指针p指向数组的第三行,p[-1]表示第二行的首元素地址,p[-1][-1]表示第二行首元素的前面一个元素,即第一行最后一个元素(二维数组在内存中也是连续的)。

数据

 

使用负数作为下标来访问数组,切记内存不要越界,访问的内存一定是存在的,否则会导致程序奔溃。

02 数组名可以放在括号中

由于数组和指针在使用上是等价的,数组可以使用指针来表示,指针也可以通过下标来访问:

a[i] = 100;
*(a + i) = 100;
*(i + a) = 100
  这三行代码的效果是一样的。 所以编译器也支持这样的用法:
i[a] = 100;
  放在二维数组中就是这样的:
int array[3][3] = {{1, 2, 3}, {2, 3, 4}, {3, 4, 5}};
printf("%d
", 2[array][2]);
  倒不是推荐这种写法,笔试题中会出现,认识就行。

03 一个字节保存多个数据

可以使用结构体位域来保存。
struct Test
{
    char a:4;
    char b:4;
};
  冒号表示位域,即a只占3位(二进制数),b占5位,结构体一共占了一个字节。 对结构体进行初始化:
struct Test t;
t.a = 1;
t.b = 3;
  在内存中的布局是这样的:

数据  

如果记录下结构体的地址,直接访问整个字节,得到的结果就是0x31。
struct Test t;
t.a = 1;
t.b = 3;


char *s = (char *)&t;
printf("%x
", *s);
 

  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分