求数组的第二大的数
#include <stdio.h>
int main () {
int data[]={2,4,6,3,8,9,7,1,0,};
int i=0;
int len=0;
int max=0,sec=0;
len=sizeof(data)/sizeof(data[0]); //数组占内存总空间,除以单个元素占内存空间大小
//while(scanf("%d",&data[i+len]!=EOF)) len++;这种为什么不行
for (i=0;i<len;i++)
{
if(data[i]>max)
{
sec=max;
max=data[i];
}
else if (data[i]>sec)
{
sec=data[i];
}
}
printf("%d\n",len);
printf("%d\n",sec);
return 0;
}
2,计算数组的长度
常见的数组就是字符数组和整型数组
一.、sizeof函数
这个函数可以求得这两种类型的数组的长度。
sizeof(...)是操作符,其定义为:typedef unsigned int size_t;
其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。
它的功能是:获得返回一个对象或者类型所占的内存字节数。
由于在编译时计算, sizeof不能用来返回动态分配的内存空间的大小。所以,用sizeof来返回类型以及静态分配的对象、结构或数组所占的空间,其返回值跟对象、结构、数组所存储的内容没有关系。
有两点需要注意。
1. 通过上述方式求得字符数组的长度总是比我们想得到的多了一,是因为字符数组在最后一位默认有一个\0的空字符,
所以比我们想象中的大了一,还要说的是\0 的作用就是标记结束,当我们使用printf 或者是puts 函数将字符数据进行输出
的时候,就是通过末位的\0来标记结束的, 如果没有\0 的话,输出结果的末尾会是乱码,所以在声明数组的时候我们需要
将数组的大小声明比我们需要的大一位, 我们使用scanf或者是gets 函数它们会默认在最后一位填上\0。
2. 上述的这个方法不适用与将数组传到函数中,在函数中使用此方法求数组的长度,结果是错误的。
数组作为参数传递时,相当于一个指针,因此sizef(arr)实际求的是指针的长度,这是个固定值。Windows64位系统,一个指针占4个字节;Linux64 位系统,一个指针占8个字节,就这点差别。这应该是8个字节把,用其除以int所占的字节数(4), 结果就是2 .
这什么区别(自己问)
二、strlen
strlen作为函数,其参数必须是字符型指针(*char),且必须以‘\0‘ 结尾。否则会一直找,最后输出随机值。
strlen函数只适用于求字符数组的长度,而且他返回的是第一个\0之前的字符长度,不需要考虑\0
另外使用strlen函数需要引入string.h头文件
在strlen中,数组名和 &数组名 均代表首元素的地址。但&数组名加上其他操作符—代表整个数组的地址。
(*数组名)代表指针解引用,为首元素内容。
应用:注意,字符类型大小为1个字节。