数组相关的运算

对于部分和我一样的初学者,由于对数组、指针、单目操作符sizeof()、strlen()函数等知识的不熟悉,使得对数组相关的运算掌握的不够好,所以经过一段时间的学习,并且根据自己的理解,将一些相关的练习进行总结。总结如下:

在进行相关练习之前必须将这几个重要的知识点完全掌握:

1、sizeof()是一个操作符(不是函数),返回的为对象/类型的字节数

'\0'是字符串结束的标志,占一个字节

2、strlen(地址)是一个函数,参数为地址,且求字符串长度时以‘\0’为结束标志,但不含'\0',

3、sizeof(arr) 和 &arr 时,arr 表示整个数组;除此之外,数组名都表示首元素的地址

4、对于指针 p[i] = *(p+i)

5、二维数组中,

  • arr单独放在sizeof()内部时,arr表示整个数组
  • arr 未单独放在sizeof()内部时,arr降级为首行元素的地址
  • arr[0]单独放在sizeof()内部时,arr[0]表示首行元素
  • arr[0]未单独放在sizeof()内部时,arr[0]降级为首元素的地址
  • *(arr+i)为第i行的首元素地址
  • (对数组中第i行的地址解以用得到该行的首元素地址)

下面则是我在vs2008中做过的一些练习、对应的结果及原因,将其总结如下:

一维数组

int a[] = {1,2,3,4};

  • // printf("%d\n",sizeof(a));              //16      sizeof(arr)时,arr表示整个数组(表示整个数组的大小)
  • // 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        &arr时,arr表示整个数组(取出整个数组的地址,还是地址
  • // 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 a[] = {'a','b','c','d','e','f'};

//类型发生变化,int四个字节,char一个字节

  • // printf("%d\n",sizeof(a));             //6          sizeof(arr)时,arr表示整个数组(表示整个数组的大小)
  • // printf("%d\n",sizeof(a+0));         //4          首元素地址
  • // printf("%d\n",sizeof(*a));            //1          首元素内容
  • // printf("%d\n",sizeof(a[1]));         //1          第二个元素内容
  • // printf("%d\n",sizeof(&a));           //4          &arr时,arr表示整个数组(取出整个数组的地址,还是地址)
  • // printf("%d\n",sizeof(&a+1));       //4          跨过该数组地址后的地址
  • // printf("%d\n",sizeof(&a[0]+1));   //4          第二个元素的地址

 

  • //printf("%d\n",strlen(a));               //随机值19        1.strlen求长度时遇到'\0'才停下;无\0,产生随机值
  • // printf("%d\n",strlen(a+0));          //随机值19        2.从第一个字符数起遇到\0; 1中将数组元素都数完遇到\0
  • // printf("%d\n",strlen(*a));             //错                   3.strlen函数的用法:strlen(地址)*a是地址对应的内容
  • // printf("%d\n",strlen(a[1]));          //错                   4.同3
  • // printf("%d\n",strlen(&a));            //随机数19        5.strlen(arr)同strlen(&arr)
  • // printf("%d\n",strlen(&a+1));        //随机数13        6.原因同5,且相差6,跳过数组中的6的个元素,每个元素大小为1.
  • // printf("%d\n",strlen(&a[0]+1));    //随机数18        7.原因同1,跳过第一个元素

 

char a[] = "abcdef";

//字符串在数组中存放时,默认会有一个'\0',占一个字节;

  • // printf("%d\n",sizeof(a));             //7               sizeof(arr)时,arr表示整个数组(表示整个数组的大小)
  • // printf("%d\n",sizeof(a+0));         //4               首元素地址
  • // printf("%d\n",sizeof(*a));            //1               首元素内容
  • // printf("%d\n",sizeof(a[1]));         //1               第二个元素内容
  • // printf("%d\n",sizeof(&a));           //4               &arr时,arr表示整个数组(取出整个数组的地址,还是地址)
  • // printf("%d\n",sizeof(&a+1));       //4               跨过该数组地址后的地址
  • // printf("%d\n",sizeof(&a[0]+1));   //4               第二个元素的地址

 

  • // printf("%d\n",strlen(a));             //6                1.strlen求长度时遇到'\0'才停下;且不包含'\0'
  • // printf("%d\n",strlen(a+0));         //6                2.从第一个字符数起遇到\0; 1中将数组元素都数完遇到\0
  • // //printf("%d\n",strlen(*a));         //错               3.strlen函数的用法:strlen(地址)*a是地址对应的内容
  • // //printf("%d\n",strlen(a[1]));      //错                4.同3
  • // printf("%d\n",strlen(&a));          //6                 5.strlen(arr)同strlen(&arr)
  • // printf("%d\n",strlen(&a+1));     //随机数12     6.跳过整个数组后,后面不可知。
  • // printf("%d\n",strlen(&a[0]+1));  //5                 7.原因同1,跳过第一个元素

 

 

char *p = "abcdef";

//字符串在数组中存放时,默认会有一个'\0',占一个字节;

  • // printf("%d\n",sizeof(p));            //4             p为指针变量,内部存放的是首元素的地址;求得地址的大小
  • // printf("%d\n",sizeof(p+1));        //4             p为指针变量,p+1内部存放的是第二个元素的地址;
  • // printf("%d\n",sizeof(*p));           //1            *p表示第一个元素
  • // printf("%d\n",sizeof(p[0]));        //1             p[0]表示第一个元素
  • // printf("%d\n",sizeof(&p));          //4             取出地址的地址,还是地址
  • // printf("%d\n",sizeof(&p+1));      //4             地址(p存放一个地址,其类型为char *;对p求地址之后存放到 指针变量char * *pp                                                                       中。所以&p+1相当于跳过这个p指针)
  • // printf("%d\n",sizeof(&p[0]+1));  //4             地址

 

  • // printf("%d\n",strlen(p));             //6              1.strlen求长度时遇到'\0'才停下,且不包含'\0';无\0,随机值
  • // printf("%d\n",strlen(p+1));        //5               2.从第2个字符数起遇到\0; 1中将数组元素都数完遇到\0
  • // //printf("%d\n",strlen(*p));         //错             3.strlen函数的用法:strlen(地址) *p是地址对应的内容
  • // //printf("%d\n",strlen(p[0]));      //错             4.对于指针 p[i] = *(p+i)
  • // printf("%d\n",strlen(&p));          //3               5.对地址取地址,未知
  • // printf("%d\n",strlen(&p+1));      //随机数7    6.对地址取地址,未知
  • // printf("%d\n",strlen(&p[0]+1));  //5               7.对地址取地址,未知

 

 

二维数组

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

  • printf("%d\n",sizeof(a));                //48                 sizeof(arr)时,arr表示整个数组(表示整个数组的大小)
  • 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                  此处a[3]只作为一种和a[0]相同的类型(a[3]表示第四行,但是不存在)

二维数组通过指针访问元素时,arr[i][j] = *( * (arr+i) +j )

以上的内容希望能对此方面不熟悉的朋友有所帮助,若有不对之处,请各位批评指正

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值