程序中的数组

在程序编写中经常会用到数组用它来存放相同类型的元素。在使用数组时特别需要注意一些陷阱或小点否则将会在程序中带来不必要的麻烦。所以在使用数组时需要注意以下几个小点:

      第一  在与数组的地址打交道时,经常会遇到sizeof(数组名)以及&数组名的这俩情况,此时这俩数组名都代表着整个数组,单位为字节。除这俩情况外但凡遇到数组名,数组名一维都代表首元素地址或二维代表数组中的第一行。

      第二  在声明数组时操作符"[]"内必须为常量,初始化字符数组时需要注意的是数组的总长度要大于等于整个数组中的字符个数,因为在字符数组的末尾系统需要添加识别数组已经结束的标志“\0",初始化要一一单列出数组元素是需要手动在最后一个字符后面添加字符“\0”,告诉系统字符结束。另外二维数组初始化时需要注意的是有时为了简便会省略元素个数的书写,但是需要注意的是二维数组的行数可以省略但列数绝对不可省略。

      第三  不论一维数组还是二维数组他们在空间中都是连续的。

      第四    语句中我们知道arr是一个数组名,同时也是一个指针,那么我们可以得出一个结论:arr[1]和*(arr+1)是一样的。其实计算机在使用数组时就是先化成这样的方式,然后在进行调用的,那么 1[arr] 也是化为 *(arr+1),有加法的交换可得出 *(arr+1) 和 *(1+arr)  是一样的,所以我们也就可用  下标[数组名]  来表示数组中的元素了,即就是  arr[1]  和  1[arr]  是一样的,有没有让你感觉到很神奇?事实就是这样,在计算机中数组名与元素个数只是操作符[]的两个操作数,互换顺序也是一个效果。

     第五  如果能把如下关于数组的所占内存数和字符串的长度的小题了如指掌可以说以后遇到诸如类似的问题应该难不倒你喽

      

 int a[] = {1,2,3,4};
  printf("%d\n",sizeof(a)); //16 数组的大小
    printf("%d\n",sizeof(a + 0)); //4 首元素地址
  printf("%d\n",sizeof(*a)); //4 首元素
  printf("%d\n",sizeof(a+1)); //4 第二个元素地址
  printf("%d\n",sizeof(a[1])); //4 第二个元素
  printf("%d\n",sizeof(&a)); //4 数组的地址
  printf("%d\n",sizeof(*&a)); //16 数组的大小(&取的是数组首元素的地址*&指向整个数组) 

printf("%d\n",sizeof(&a+1)); //4 是一个地址
    printf("%d\n",sizeof(&a[0])); //4 首元素地址

   printf("%d\n",sizeof(&a[0]+1)); //4 第二个元素地址


char arr[] = {'a','b','c','d','e','f'};

  

   printf("%d\n", sizeof(arr));  //6 数组的大小

   printf("%d\n", sizeof(arr+0));//4 首元素地址

   printf("%d\n", sizeof(*arr)); //1 首元素

   printf("%d\n", sizeof(arr[1])); //1 第二个元素

   printf("%d\n", sizeof(&arr)); //4 数组的地址

   printf("%d\n", sizeof(&arr+1)); //4 下一个数组的地址

   printf("%d\n", sizeof(&arr[0]+1)); //4 第二个元素地址

 

printf("%d\n", strlen(arr)); //随机值x 执行需遇到"\0"结束

printf("%d\n", strlen(arr + 0)); //随机值x 执行需遇到"\0"结束

printf("%d\n", strlen(*arr)); //error 执行的"a"的ASCII

printf("%d\n", strlen(arr[1])); //error 执行的"b"的ASCII

printf("%d\n", strlen(&arr)); //随机值x 执行需遇到"\0"结束

printf("%d\n", strlen(&arr + 1)); //随机值x-6 执行需遇到"\0"结束

printf("%d\n", strlen(&arr[0] + 1)); //随机值x-1 执行需遇到"\0"结束


char arr[] = "abcdef";

printf("%d\n", sizeof(arr)); //7 数组的大小,包括"\0"

printf("%d\n", sizeof(arr + 0)); //4 首元素地址

printf("%d\n", sizeof(*arr)); //1 首元素

printf("%d\n", sizeof(arr[1])); //1 第二个元素

printf("%d\n", sizeof(&arr)); //4 数组的地址

printf("%d\n", sizeof(&arr + 1)); //4 下一个数组的地址

printf("%d\n", sizeof(&arr[0] + 1)); //4 第二个元素地址

   printf("%d\n", strlen(arr)); //6 数组的长度

printf("%d\n", strlen(arr+0); //6 数组的长度

   printf("%d\n", strlen(*arr)); //error 执行的"a"的ASCII

   printf("%d\n", strlen(arr[1])); //error 执行的"b"的ASCII

   printf("%d\n", strlen(&arr)); //6 数组的长度

   printf("%d\n", strlen(&arr+1)); //随机值

   printf("%d\n", strlen(&arr[0]+1)); //5 从第二个元素开始的数组长度


char *p = "abcdef";

printf("%d\n", sizeof(p)); //4 指针变量大小

printf("%d\n", sizeof(p + 1)); //4 第二个元素地址

printf("%d\n", sizeof(*p)); //1 首元素

printf("%d\n", sizeof(p[0])); //1 首元素

printf("%d\n", sizeof(&p + 1)); //4 跳过p的地址

printf("%d\n", sizeof(&p[0] + 1)); //4 第二个元素地址

   printf("%d\n", strlen(p)); //6 数组长度

   printf("%d\n", strlen(p+1)); //5 从第二个元素开始的数组长度

   printf("%d\n", strlen(*p)); //error 执行的"a"的ASCII

   printf("%d\n", strlen(p[0])); //error 执行的"a"的ASCII

   printf("%d\n", strlen(&p)); //随机值

   printf("%d\n", strlen(&p+1)); //随机值


int a[3][4] = {0};

       printf("%d\n",sizeof(a)); //48 数组的大小

     printf("%d\n",sizeof(a[0][0])); //4 首元素

     printf("%d\n",sizeof(a[0])); //16 第一行元素

printf("%d\n",sizeof(a[0]+1)); //4 第一行第二个元素

printf("%d\n",sizeof(a+1)); //4 第二行第一个元素地址

printf("%d\n",sizeof(&a[0]+1)); //4 第二行地址

printf("%d\n",sizeof(*a)); //16 第一行元素

printf("%d\n",sizeof(a[3])); //16 sizeof(表达式) 内部表达式不计算。这里就表示一行元素

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值