有关数组的运算!(ps:归纳的好不容易。。。)

一维数组

1.数组名单独放在sizeof内部,数组名表示整个数组,所以sizeof(数组名)计算的是整个数组的大小,单位是字节。
2.&数组名,数组名表示整个数组,所以&数组名取出的是整个数组的地址。
3.除此之外,所有的数组名都表示首元素地址。

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

printf("%d\n",sizeof(a)); //16
//数组名单独放在sizeof内部,求的是数组总大小,单位是字节。
printf("%d\n",sizeof(a+0));//4
//根据规则3:a在这里表示首元素的地址,首元素地址+i,表示下标为i 的地址。所以这里求的是首元素的地址。
printf("%d\n",sizeof(*a));//4
//a既没有单独放在sizeof内部,也没有取地址,所以a表示首元素的地址,对其解引用,访问的就是首元素,
//首元素是整型,整型大小是4个字节。
printf("%d\n",sizeof(a+1));//4
//这里a同样是首元素地址,首元素地址+1,表示下一个元素的地址。是地址就是4.
printf("%d\n",sizeof(a[1]));//4
//a[i]表示第i个元素的地址,这里表示第二个元素的地址。
printf("%d\n",sizeof(&a));//4
//&a取出的是整个数组的地址,但它还是个地址,是地址就是4.(32位平台是4个字节,64位平台是8个字节)。
printf("%d\n",sizeof(*&a));//16
//&a取的是整个数组的地址,对其解引用之后就是整个数组,整个数组的地址就是16.
//(整型指针+1:跳过一个整型;字符指针+1:跳过一个字符;数组指针+1:跳过一个数组。)
printf("%d\n",sizeof(&a+1));//4
//&a是整个数组的地址,+1后跳过整个数组,跳过16个字节,这时候它还是一个地址,是地址就是4个字节。
printf("%d\n",sizeof(&a[0]));//4
//第一个元素的地址。
printf("%d\n",sizeof(&a[0]+1));//4
//&a[0]第一个元素的地址,+1是第二个元素的地址。

字符数组

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


printf("%d\n",sizeof(arr));//6
//数组名单独放在sizeof内部,表示整个数组的大小,大小是6.
printf("%d\n",sizeof(arr+0));//4
//在这里arr相当于首元素地址,首元素地址+0,也是首元素地址。是地址就是4个字节,不管它是什么类型。
printf("%d\n",sizeof(*arr));//1
//在这里arr是首元素地址,对其解引用是首元素,首元素是1,首元素大小是1个字节,所以是1.
printf("%d\n",sizeof(arr[1]));//1
//arr[1]是首元素,首元素大小是1.
printf("%d\n",sizeof(&arr));//4
//&arr取出整个数组的地址,地址是四个字节。
printf("%d\n",sizeof(&arr+1));//4
//&arr取出了整个数组的地址,+1是下一个数组的地址,是地址就是4.
printf("%d\n",sizeof(&arr[0]+1));//4
//第二个元素‘b'的地址。

字符数组

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


printf("%d\n",strlen(arr));//随机值
//strlen求字符串长度,它一定要找到字符串的结束标志‘\0’才会停下来,但在这里没有‘\0’。
printf("%d\n",strlen(arr+0));//随机值
//这里没有&,没有sizeof,所以这里arr是首元素地址,首元素地址+0,依然是首元素地址,所以这里是随机值。
printf("%d\n",strlen(*arr));//err程序错误
//*arr是首元素的值,这里是把‘a'传进去了,strlen这里应该传的地址,此时是把a当做地址,
//a的ASCCL码值是97,那么就是把97当做一个地址输入到字符里去了,在这里程序会出错,
//因为访问了一块非法空间。
printf("%d\n",strlen(arr[1]));//err
//这里跟上一题一样,只是访问了b。
printf("%d\n",strlen(&arr));//随机值
//&arr取出来的是数组的地址,数组地址和数组首元素地址是一样的,意思是在同一个位置向后数。
printf("%d\n",strlen(&arr+1));//随机值
//&arr+1指的是下一个数组。也是随机值。
printf("%d\n",strlen(&arr[0]+1));//随机值
//这个随机值比前面的随机值少1,因为是从第二个元素开始数的。
char arr[] = "abcdef";

printf("%d\n",sizeof(arr));//7
//在sizeof里把’\0’也放进去了。
printf("%d\n",sizeof(arr+0));//4
//首元素地址+0,还是首元素地址。
printf("%d\n",sizeof(*arr));//1
//首元素地址解引用是a,a是一个字符,大小是1.
printf("%d\n",sizeof(arr[1]));//1
//arr[1]表示第2个元素,第二个元素是字符,大小是1.
printf("%d\n",sizeof(&arr));//4
//&arr表示整个数组的地址,是地址就是4.
printf("%d\n",sizeof(&arr+1));//4
//+1,跳到'\0'后面,也就是下一个数组的地址。是地址就是4.
printf("%d\n",sizeof(&arr[0]+1));//4
//从b开始的地址,是地址就是4.


printf("%d\n",strlen(arr));//6
//这里找到了'\0',所以数组长度是6.
printf("%d\n",sizeof(arr+0));//6
//arr和arr+0都代表首元素地址。从同一个位置开始数。
printf("%d\n",sizeof(*arr));//err
printf("%d\n",sizeof(arr[1]));//err
printf("%d\n",sizeof(&arr));//6
//&arr取出的数组的地址,但数组的地址就是首元素的地址。strlen找到地址后向后数字符,跟类型没有关系。
//(注:arr和&arr都指的是同一个开始的位置,区别在于arr+1是从下一个元素的位置开始,
//而&arr+1指的是跳过'\0'的位置。)
printf("%d\n",sizeof(&arr+1));//随机值
//在这里把'\0'也跳过去了,所以我们不知道后面是什么,所以是随机值。
printf("%d\n",sizeof(&arr[0]+1));//5
//&arr[0]是第一个元素往后的地址,+1是从第二个元素往后的地址,从'b'开始往后数,所以是5.



char *p = "abcdef";

printf("%d\n",sizeof(p));//4
//P是个指针变量,里面存的是4个字节。
printf("%d\n",sizeof(p+1));//4
//p是个地址,p是char*的指针,+1向后跳了一个字符,这里指向的是b,这里还是4个字节。
printf("%d\n",sizeof(*p));//1
//P是个字符指针,解引用访问的是一个字节。
printf("%d\n",sizeof(p[0]));//1
//p[0]就是*(p+0),简单来说就是字符'a',字符指针解引用就是一个字节。
printf("%d\n",sizeof(&p));//4
//&p取出来的是p的地址。
printf("%d\n",sizeof(*p+1));//4
//*p+1是一个地址。指向变量p的后面。
printf("%d\n",sizeof(&p[0]+1));//4
//&p[0]是个地址,+1还是个地址。所以是4.&p[0]q取出的是a的地址,&p[0]+1指向的是b,



char *p = "abcdef";


printf("%d\n",strlen(p));//6
//P指的是abcdef,因为p里存的是a的地址,站在a的地址向后数,数的是6。
printf("%d\n",strlen(p+1));//5
//p指向的是a,+1指向的是b.从b开始往后数是5.因为字符指针+1跳过一个字符。
printf("%d\n",strlen(*p));//err
//*p是a,a传给了strlen是错误的,我们需要的是地址。
printf("%d\n",strlen(p[0]));//err
//同上。
printf("%d\n",strlen(&p));//随机值
//&p是从p的位置往后走,我们不知道这个地址是什么,所以是随机值。
printf("%d\n",strlen(&p+1));//随机值
//
printf("%d\n",strlen(&p[0]+1));//5
//&p[0]取出的是a 的地址,+1是从b 的地址往后数5个。

二维数组

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

printf("%d\n",sizeof(a)); //48
 //数组名a单独放在sizeof内部,求的是整个数组的大小,单位是字节。当数组名前有一个&(取地址)操作符时
 //,取出的是整个数组的地址。除此之外,所有的数组名都代表首元素地址。
printf("%d\n",sizeof(a[0][0]));//4
 //第一行的第一个元素,大小是4.
printf("%d\n",sizeof(a[0]));//16
//a[0]表示二维数组第一行的数组名,它放在sizeof内部,表示的是第一行整个数组的大小。
单位是字节,大小是16.
printf("%d\n",sizeof(a[0]+1));//4
//a[0]如果单独放在sizeof内部表示第一行数组的数组名,但在这并没有,所以它降级成为了第一行首元素的地址  
//a[0][0],再+1就是a[0][1],表示第一行第二个元素的地址。  
printf("%d\n",sizeof(a+1));//4
//二维数组的数组名在这里并没有单独放在sizeof内部,所以他就降级成为首元素的地址,二维数组的首元素  
//是第一行,第一行的地址+1,成为第二行的地址,是地址就是4.
printf("%d\n",sizeof(&a[0]+1));//4
//a[0]第一行的数组名,前面+&,取出第一行的地址,第一行的地址+1,第二行的地址。
printf("%d\n",sizeof(*a));//16
//a有放在sizeof内部,没有取地址,所以降级变成首元素地址,二维数组的首元素地址是第一行的地址,
对其解引用,拿出来的是16个字节。
printf("%d\n",sizeof(a[3]));//16
//sizeof内部的表达式不参与运算,既然不参与运算,我们也无从得知它的大小,只能看类型,a[3]访问的是 
//第四行,但我们并没有真正去拿第四行。a[3]相当于第四行的数组名,第四行的数组名单独放在sizeof内部, 
//求的是第四行数组的大小,但实际上它是不存在的。相当于sizeof(int),我们只看类型。

总结:
数组名代表整个数组的时候只有两种情况:
1、sizeof(数组名),这里的数组名表示整个数组。
2、&数组名,这里的数组名表示整个数组。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值