Linux C语言:一维数组、字符数组和字符串数组打印总结

一、一维数组

1)一维数组的大小 

int a[]={1,2,3,4};
1、printf(“%d\n”,sizeof(a));
        解:计算的是整个数组的大小:4x4=16

2、printf(“%d\n”,sizeof(a+0));
        解:a+0表示首元素的地址,所以sizeof(a+0)表示计算的是地址的大小;地址大小在32位操作系统是4字节,64位操作系统是8字节;

3、printf(“%d\n”,sizeof(*a));
        解:a表示数组首元素的地址,*a表示对这个地址解引用,就是数组第一个元素的值。sizeod(*a)表示计算第一个数组元素值得大小,而数组是整型数组,其中每个元素都是int类型,在内存中占4个字节;

4、printf(“%d\n”,sizeof(a+1));
        解:a+0表示数组第二个元素的地址,sizeof(a+1)表示计算地址大小,4/8;

5、printf(“%d\n”,sizeof(a[1]));
        解:a[1]表示第二个元素,sizeof(a[1])表示计算元素大小,结果为4字节;

6、printf(“%d\n”,sizeof(&a));
        解:&a表示整个数组的地址,sizeof(&a)表示计算整个数组地址大小,为4/8; 

7、printf(“%d\n”,sizeof(*&a));
        解:* &a表示对整个数组解引用,sizeof(*&a)表示计算整个数组大小,为16字节; 

8、printf(“%d\n”,sizeof(&a+1));
        解:&a+1表示整个数组+1之后的地址,sizeof(&a+1)表示对数组后面的地址进行计算,地址的大小为4/8; 

9、printf(“%d\n”,sizeof(&a[0]));
        解:&a[0]表示取出第一个元素的地址,sizeof(&a[0])计算第一个元素的地址4/8;

10、printf(“%d\n”,sizeof(&a[0]+1));
        解:表示计算第二个元素的地址,4/8;

二、字符数组

1)字符数组的大小 

char arr[]={‘a’,‘b’,‘c’,‘d’,‘e’,‘f’};
1、printf(“%d\n”,sizeof(arr);
        解:计算的是字符数组的大小,为6;

2、printf(“%d\n”,sizeof(arr+0);
        解:计算的是数组第一个元素地址大小,4/8;

3、printf(“%d\n”,sizeof(*arr);
        解:计算的是数组首元素大小,为1字节;  

4、printf(“%d\n”,sizeof(arr[1]);
        解:计算数组第二个元素大小,1字节;

5、printf(“%d\n”,sizeof(&arr);
        解:计算的是整个数组的大小,为4/8;

 6、printf(“%d\n”,sizeof(&arr+1);
        解:计算的是整个数组+1后的地址大小,为4/8;

7、printf(“%d\n”,sizeof(&arr[0]+1);
        解:计算的是第二个元素地址大小,4/8;

2)字符数组长度

1、printf(“%d\n”,strlen(arr));
        解:随机值,因为我们知道strlen()函数计算字符串,是以\0结束;如果扫描不到\0,它就会一直在内存中扫描下去,直到遇见\0为止;

 2、printf(“%d\n”,strlen(arr+0));
        解:随机值,同上;

 3、printf(“%d\n”,strlen(arr));
        解:我们知道,库函数strlen()它的参数是一个字符指针,如int strlen(const charstr);而*arr表示对字符数组首元素解引用,即是访问’a’字符,而我们又知道’a’字符在内存中表示为ASCLL码,为97,而97这个数组传给strlen()函数时,它会把它当成一个地址来访问,我们也不知道地址97里放的啥,会报错。

4、printf(“%d\n”,strlen(arr[1]));
        解:arr[1]表示字符’b’,分析同上,报错;

5、printf(“%d\n”,strlen(&arr));
        解:传字符数组地址,得到是随机值,strlen()扫描数组时,找不到\0,会一直找下去;

6、printf(“%d\n”,strlen(&arr+1));
        解:随机值;扫描字符数组后的地址内容,我们不知道字符数组后面地址的存储内容,但是这个随机值和strlen(&arr)的随机值是相差6字节的;

7、printf(“%d\n”,strlen(&arr[0]+1));
        解:随机值,传给strlen()的是字符’b’的地址;

三、字符串数组                  

1)字符串的大小和长度

char arr[]=“abcdef”;
1、printf(“%d\n”,sizeof(arr));
        解:sizeof()计算字符串长度时会把字符串后面自带的\0计算进去,所以为7字节;

2、printf(“%d\n”,sizeof(arr+0));
        解:计算首元素地址,4/8字节;

3、printf(“%d\n”,sizeof(*arr));
        解:计算首元素大小,1字节;

4、printf(“%d\n”,sizeof(arr[1]));
        解:计算第二个元素大小,1字节;

5、printf(“%d\n”,sizeof(&arr));
        解:计算整个数组的地址,4/8;

6、printf(“%d\n”,sizeof(&arr+1));
        解:计算字符串数组之后的地址大小,4/8;

7、printf(“%d\n”,sizeof(&arr[0]+1));
        解:计算第二个元素的地址大小,4/8;

8、printf(“%d\n”,strlen(arr))
        解:strlen计算字符串长度,遇到字符串后\0,停止;字符数组arr大小为6字节;

9、printf(“%d\n”,strlen(arr+0))
        解:arr+0表示首元素地址,但我们知道strlen要遇到\0才停止,所以会扫描完整个字符数组,结果为6字节;

10、printf(“%d\n”,strlen(*arr))
        解:报错;

11、printf(“%d\n”,strlen(arr[1]))
        解:报错;

12、printf(“%d\n”,strlen(&arr))
        解:6字节,我们知道strlen的形参为char*类型,即字符指针,每次访问一个字节,当我们传&arr整个字符数组的地址给strlen时,它会从这个地址开始,一个字节一个字节的往后访问,直到遇到\0为止,它不会以整个字符数组的大小来访问;

13、printf(“%d\n”,strlen(&arr+1))
        解:随机值;字符数组后的内存空间我们不知道具体存放内容;

14、printf(“%d\n”,strlen(&arr[0]+1))
        解:大小为5;从字符数组第二个元素开始扫描,直到遇到\0;

2)字符串指针大小和长度 

char *p = "abcdef"

1、printf(“%d\n”,sizeof§);
        解:计算首地址大小,4/8;

2、printf(“%d\n”,sizeof(p+1));
        解:计算第二个元素地址大小,4/8;

3、printf(“%d\n”,sizeof(*p));
        解:计算第一个元素大小,1;

4、printf(“%d\n”,sizeof(p[0]));
        解:计算第一个元素大小,1;

5、printf(“%d\n”,sizeof(&p));
        解:计算指针地址大小,4/8;

6、printf(“%d\n”,sizeof(&p+1));
        解:计算指针地址+1后的地址大小,4/8;

7、printf(“%d\n”,sizeof(&p[0]+1));
        解:计算第二个元素地址大小,4/8;

8、printf(“%d\n”,strlen§);
        解:大小为6;p是指针,存放的是字符串首元素的地址,传参给strlen的是首元素的地址,strlen函数就会找到第一个元素,并从第一个元素向后扫描,直到遇到\0后结束;

9、printf(“%d\n”,strlen(p+1));
        解:大小为5;p+1表示的是字符串第二个元素的地址,strlen会找到第二个元素,并从第二个元素开始扫描,直到遇见\0为止;

10、printf(“%d\n”,strlen(*p));
        解:报错;*p表示对指针解引用,就是访问地址里所指向的数值,即此时的值是字符’a’,,而a字符在内存中是以ASCLL码存放,为数值97,而strlen接收到这个数值“97”后,会把它当初一个地址,去访问内存中97处的数值,此时编译器就会报错,我们也不知道97地址处存放的是啥;

四、总结

1、sizeof(数组名),表示计算整个数组大小;

2、sizeof(&数组名),表示计算整个数组所占地址大小,而一旦是计算地址,只有两个值:4字节(32位操作系统),8字节(64位操作系统);

3、除了这两种情况外,所有的数组名代表的都是首元素的地址!

4、sizeof(字符串)时,将会把字符串后面自带的\0计算在内,而\0在内存中占一个字节;

5、strlen()是计算字符串长度的,使用时需要给它传递一个地址,它接收到地址后将从这个地址开始,以每次一个字节大小访问,直到扫描到\0为止,字符串后面都自带有一个\0,而如果strlen()计算的不是字符串,它后面就没有自带的\0,将返回一个随机值或者报错;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值