了解sizeof和strlen以及关于数组的相关计算

在进行学习关于c语言数组中的计算之前,我们先来了解一些基本概念。

1、什么是数组?

把具有相同数据类型的若干变量按有序的形式组织起来, 以便于程序处理,这些数据元素的集合就是数组。

当然了,数组分为一维数组,二维数组等等,今天我们就先来拿一维数组来举例吧!

一维数组的定义为 int a[10]

(1)、其中 int 为类型,即整型(还有字符型 char 和float 实型等)
(2)、a 为数组名 [] 为下标符号,里面的数字常量为 数组的第几个元素。
例如 :a[0]为 数组a[10]的第一个元素。
数组元素下标值是从0开始的,即你定义a[10],
则他的成员数为a[0]到a[9]

在C语言中数组名就是一个指向数组首地址的一个指针常量。
例如:
int a[100];
那么,a就是一个指向a[0]的int 型的指针常量。

2、什么是sizeof?

sizeof是C语言的一种单目操作符,注意!sizeof可不是一个函数!

sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。来举个例子吧。

      printf("%d\n",sizeof(int));//输出结果是4(32位平台下int所占字节的大小)

3、什么是strlen?

strlen是计算字符串s的(unsigned int型)长度的一个函数,不包括’\0’在内。

strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符’\0’为止,然后返回计数器值。

注意!!!

(1)、strlen求的是字符串的实际长度,它求得方法是从开始到遇到第一个’\0’,如果你只定义没有给它赋初值,这个结果是不定的,它会从首地址一直找下去,直到遇到’\0’停止。

(2)、sizeof()返回的是变量声明后所占的内存数,不是实际长度。

好啦!了解了以上相关知识,让我们来看看一些有助于我们深入理解sizeof和strlen的代码吧!

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

printf("%d\n",sizeof(a));//16  当数组名单独放在sizeof()的时候代表整个数组,因为数组中有4个int型元素,所以结果为16.

printf("%d\n",sizeof(a+0));//4  数组名表示首元素的地址,而a+0代表的是第一个元素地址所占内存,故为4.

printf("%d\n",sizeof(*a));//4  *a代表首元素,首元素4个字节

printf("%d\n",sizeof(a+1));//4  首元素的地址+1,

printf("%d\n",sizeof(a[1]));//4  指向的是数组中的第二个元素,一个整型,大小为4

printf("%d\n",sizeof(&a));//4  当&数组名的时候,表示整个数组,&指的是整个数组的地址,它还是一个地址,所以大小为4.

printf("%d\n",sizeof(*&a));//16(*&a)代表是整个数组,所以大小为16

printf("%d\n",sizeof(&a+1));//4 &a+1跳过整个数组后的地址,还是4个字节

printf("%d\n",sizeof(&a[0]));//4  &a[0]数组首元素的地址,还是4个字节
printf("%d\n",sizeof(&a[0]+1));//4 &a[0]+1指向第二个元素的地址,4个字节
                char *p = "abcdef";
printf("%d\n", sizeof(p));//4  p中存放的a的地址,地址大小为4个字节
printf("%d\n", sizeof(p+1));//4 p+1之后还是地址,大小为4个字节
printf("%d\n", sizeof(*p));//1  *p代表的是字符a,它所占空间的大小为1个字节
printf("%d\n", sizeof(p[0]));//1 p[0]代表的是字符a,它所占空间的大小为1个字节
printf("%d\n", sizeof(&p));//4  表示指针变量p的地址,大小为4个字节
printf("%d\n", sizeof(&p+1));//4 &p+1还是一个地址,大小为4个字节
printf("%d\n", sizeof(&p[0]+1));//4 &p[0]+1是指字符'b'的地址,大小为4个字节。

总结:

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

2、在sizeof中,凡是求地址的,在32位平台下,其大小都为4个字节,在64位平台下,其大小都为8个字节。

关于sizeof的知识我们今天就说到这里,接下来我们看看关于求数组strlen的代码吧

         char arr[] = {'a','b','c','d','e','f'};
  printf("%d\n", strlen(arr));//随机值,数组中没有'\0',strlen遇到'\0'才会停止计数,所以为随机值

  printf("%d\n", strlen(arr+0));//随机值,数组中没有'\0',strlen遇到'\0'才会停止计数,所以为随机值

  printf("%d\n", strlen(*arr));//系统崩溃,*arr代表字符a,它不是一个有效地址

  printf("%d\n", strlen(arr[1]));//系统崩溃,*arr代表字符a,它不是一个有效地址

  printf("%d\n", strlen(&arr));//随机值,数组中没有'\0',strlen遇到'\0'才会停止计数,所以为随机值

  printf("%d\n", strlen(&arr+1));//随机值,跳过整个数组后开始往后找,遇到'\0'才会停止计数,所以为随机值.这个输出结果应比上一个输出结果少6,因为它是跳过这个数组,去下一个数组开始找。
  printf("%d\n", strlen(&arr[0]+1));//随机值, 从数组的第二个字符开始往后找,数组中没有'\0',strlen遇到'\0'才会停止计数,所以为随机值。
                char *p = "abcdef";

printf("%d\n", strlen(p));//6  p存的是字符a的地址,从a开始遇到'\0'结束。因为strlen不包括'\0',所以结果为6.

printf("%d\n", strlen(p+1));//5 p+1指向的是第二个字符b的地址,从b开始遇到'\0'结束。因为strlen不包括'\0',所以结果为6.

printf("%d\n", strlen(*p));//系统崩溃,*p代表字符a,它不是一个有效地址

printf("%d\n", strlen(p[0]));//系统崩溃,代表字符a,它不是一个有效地址

printf("%d\n", strlen(&p));//随机值,&p代表的是字符指针的地址,其后面不知道存放的是什么,所以strlen不知道什么时候会停止计数.

printf("%d\n", strlen(&p+1));//随机值 从p的地址后面的一个地址开始往后面找,其后面不知道存放的是什么,所以strlen不知道什么时候会停止计数.

printf("%d\n", strlen(&p[0]+1));//5  从第二个元素开始往后找,遇到'\0'结束。所以为5.2sizeof
printf("%d\n", sizeof(p));//4  p中存放的a的地址,地址大小为4个字节
printf("%d\n", sizeof(p+1));//4 地址+1之后还是地址,大小为4个字节
printf("%d\n", sizeof(*p));//1  ‘a’字符所占空间的大小为1个字节
printf("%d\n", sizeof(p[0]));//1 ‘a’字符所占空间的大小为1个字节
printf("%d\n", sizeof(&p));//4  表示指针变量p的地址还是地址,大小为4个字节
printf("%d\n", sizeof(&p+1));//4 指针变量p的地址后面的一个地址,还是4个字节
printf("%d\n", sizeof(&p[0]+1));//4 字符'a'后面一个字符'b'的地址,还是地址,大小为4个字节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值