C语言 matlab求数组长度元素的个数及长度

他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)C语言,数组用什么函数,计算数组长度?
[问题点数:20分]
C语言,数组用什么函数,计算数组长度?
[问题点数:20分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2013年3月 C/C++大版内专家分月排行榜第三
2014年 总版技术专家分年内排行榜第二
2013年 总版技术专家分年内排行榜第三
2014年10月 C/C++大版内专家分月排行榜第三2014年4月 C/C++大版内专家分月排行榜第三
2014年10月 C/C++大版内专家分月排行榜第三2014年4月 C/C++大版内专家分月排行榜第三
匿名用户不能发表回复!|C语言中数组的一些基本知识小结
转载 & & 作者:ForeverYoung21
这篇文章主要介绍了C语言中数组的一些基本知识小结,其中重点是对于数组的内存分配相关方面的知识整理,需要的朋友可以参考下
初始化数组
int ages[3] = {4, 6, 9};
int nums[10] = {1,2}; // 其余的自动初始化为0
int nums[] = {1,2,3,5,6}; // 根据大括号中的元素个数确定数组元素的个数
int nums[5] = {[4] = 3,[1] = 2}; // 指定元素个数,同时给指定元素进行初始化
int nums[3]; nums[0] = 1; nums[1] = 2; nums[2] = 3; // 先定义,后初始化
定义但是未初始化,数组中有值,但是是垃圾值。
对于数组来说,一旦有元素被初始 化,其他元素都被赋值0。
计算数组中元素的个数
int count = sizeof(数组) / sizeof(数组[0]) // 数组的长度 = 数组占用的总字节数 / 数组元素占用的字节数
数组注意事项
在定义数组的时候[]里面只能写整型常量或者是返回整型常量的表达式。
int ages['A'] = {19, 22, 33};
printf("ages[0] = %d\n", ages[0]);
int ages[5 + 5] = {19, 22, 33};
printf("ages[0] = %d\n", ages[0]);
int ages['A' + 5] = {19, 22, 33};
printf("ages[0] = %d\n", ages[0])
错误写法。
没有指定元素个数(int nums[] = {1,2,3,5,6}; 这样是可以的,但是如果先声明,并没有初始化,则是错误的)
int a[]; // 错误
[]中不能放变量
int number = 10;
int ages[number]; // 不报错, 但是没有初始化, 里面是随机值
& int number = 10;
& int ages[number] = {19, 22, 33} // 直接报错
- & int ages10[5];
& ages10 = {19, 22, 33};
// 错误。只能在定义数组的时候进行一次性(全部赋值)的初始化
& - 访问数组越界。
数组的内存分配:
变量在内存中是从大到小寻址的(内存中以字节为单位),比如00 在内存中,的地址是最小的;而数组则有些不同,数组的元素自然的从上往下排列 存储,整个数组的地址为首元素的地址。 (但是组成元素的字节还是按从大到小)
注意:字符在内存中是以对应ASCII值的二进制形式存储的,而非上表的形式。 在这个例子中,数组x的地址为它的首元素的地址0x08,数组ca的地址为0x03。
注意数组越界问题,越界会访问到其他内容(比如有两个数组在内存中挨着,第一个数组越界可能会访问到第二个数组的元素),甚至会让程序崩溃。
当数组名作为函数参数时, 因为自动转换为了指针类型,所以在函数中无法动态计算除数组的元素个数。
在64位编译器下,指针类型默认为8个字节。
有的时候我们可能想要在一个函数里面动态计算数组的个数,所以可能会这么做:
void printMyArray(int myArray[]) {
int length = sizeof(myArray) / sizeof(myArray[0]);
for(int i = 0; i & i++) {
printf("%i", myArray[i]);
int main() {
int myArray[5] = {1,2,3,4,5};
printMyArray(myArray);
可以看到在printMyArray函数中我们动态计算传进来的数组的个数,但是结果是错误的,因为它只能输出前两个数。
这是因为,在把数组当成函数的参数的时候,数组会被认为成指针,所以是8个字节,所以计算出的length是2,所以只能输出前两个数字。
解决:我们需要给出一个新的参数来获得length,在main()里面计算好length然后传入printMyArray。
void printMyArray(int myArray[], int length) {
for(int i = 0; i & i++) {
printf("%i ", myArray[i]);
int main(int argc, const char * argv[]) {
int myArray[5] = {1,2,3,4,5};
int length = sizeof(myArray) / sizeof(myArray[0]);
printMyArray(myArray, length);
“填坑法”的思想:
比如给出这样一题。要求从键盘输入6个0~9的数字,排序后输出。
做法有很多,”填坑法”的意思就是首先定义一个10个数的数组(0~9),初始化都为0。
接着接受用户的输入(可以用for循环),关键的一步是,将用户输入的值作为数组的下标,将这个下标所对应的值改为1(填坑),再接着for循环输出数组中值是1的索引。
// 空间换时间, 适合数据比较少
1.定义数组,保存用户输入的整数
一定要给数组初始化, 否则有可能是一些随机值
int numbers[10] = {0};
2.接收用户输入的整数
2.1定义变量接收用户输入的整数
int index = -1;
for (int i = 0; i & 6; i++) {
printf("请输入第%d个整数\n", i + 1);
scanf("%d", &index);
将用户输入的值作为索引取修改数组中对应的元素的值为1
指针的时候回来演示刚才的问题
numbers[index] = 1 ;
int length = sizeof(numbers) / sizeof(numbers[0]);
for (int i = 0; i & i++) {
if (1 == numbers[i]) {
// 输出索引
printf("%d", i);
这个做法的要点是数组中的初始值都为0,而数组的索引和用户输入的数字是一一对应的,所以只需要将用户输入的数字相对应的索引的元素改成1,然后再for循环输出的话相当于有序输出,最后得到结果。
但是这种做法是有问题的,比如用户输入了重复的数字,但是上面的做法只能将相同的数字输出一次。我们的做法是将相同索引的元素的数字累加,之后再增加一层循环来进行输出。
1.定义数组,保存用户输入的整数
int numbers[10] = {0};
2.接收用户输入的整数
2.1定义变量接收用户输入的整数
int index = -1;
for (int i = 0; i & 6; i++) {
printf("请输入第%d个整数\n", i + 1);
scanf("%d", &index);
将用户输入的值作为索引取修改数组中对应的元素的值为1
假设 用户输入的是 1,1,1,2,2,2
numbers[index] = numbers[index] + 1 ;
int length = sizeof(numbers) / sizeof(numbers[0]);
for (int i = 0; i & i++) {
j = 1 因为如果数组元素中存储的值是0不用输出
将i对应存储空间中的元素取出,判断需要输出几次
for (int j = 1; j &= numbers[i]; j++) {
printf("%d", i);// 1 1 1 2 2 2
主要思想就是,基本上默认数组中第一个元素为最大(最小)值,之后将这个元素和后面的每个元素都进行比较,以由大到小排序为例,当第一个值遇到比其大的,就进行交换。这样第一轮过后,第一位就是最大的。接着进行第二轮,由第二个数开始逐个比较,遇到比第二个数大的进行交换,这样第二轮之后第二个数就是第二大的了,以此类推,不断进行选择,最后完成排序。
void selectSort(int numbers[], int length) {
for (int i = 0; i & i++) {
for (int j = i + 1; j & j++) {
if (numbers[i] & numbers[j]) {
int temp = numbers[i];
numbers[i] = numbers[j];
numbers[j] =
int main(int argc, const char * argv[]) {
int myArray[] = {42, 7, 1, -3, 88};
int length = sizeof(myArray) / sizeof(myArray[0]);
selectSort(myArray, length);
for (int i = 0; i & i++) {
printf("%i ", myArray[i]);
在写的时候可以这样想:当第一个数来比较的时候,i = 0,那么j应该等于i + 1,因为第一个数要和第二个数开始比,并且比较length - 1次;当i = 1时,j = 2,并且比较length - 2次,以此类推;上面写的是由大到小排序。
主要思想是两个相邻的元素进行比较,以由小到大排序为例,那么由第一个元素开始和第二个比较,如果第一个比第二个大,那么就进行交换;然后进行第二个和第三个元素的比较,以此类推,第一轮之后,那么数组的最后一个元素就是最大的,以此类推。
void bubbleSort(int numbers[], int length) {
for (int i = 0; i & length - 1; i++) {
for (int j = 0; j & length - i - 1; j++) {
if (numbers[j] & numbers[j + 1]) {
int temp = numbers[j];
numbers[j] = numbers[j + 1];
numbers[j + 1] =
int main(int argc, const char * argv[]) {
int myArray[] = {42, 7, 1, -3, 88};
int length = sizeof(myArray) / sizeof(myArray[0]);
bubbleSort(myArray, length);
for (int i = 0; i & i++) {
printf("%i ", myArray[i]);
注意这里和选择排序不同的是,比较的并非numbers[i]和numbers[j],而是比较的numbers[j]和numbers[j+1],而外层循环的i代表比较的轮数,内层循环才是真正的每一轮进行的比较。这里是由小到大排序。
折半查找顾名思义,我们找到数组的最大值max,最小值min求出中间值mid,然后用mid作为数组下标得到对应的元素,用这个元素和目标值key进行比较:
如果numbers[mid] & key,那么说明key在min和mid之间,那么就设置max为mid - 1,min不变,然后重新计算mid,重复上述步骤,最后找出key。
如果numbers[mid] & key,那么说明key在mid和max之间,那么就设置min为mid + 1,max不变,然后重新计算mid,重复上述步骤,最后找出key。
注意这里的结束条件,有可能数组中有这个key,也有可能没有,那么当min & max时,说明数组中并没有这个key,要小心这种情况。
折半查找要求数组必须是有序的。(有序表)
int binSearch(int myArray[], int length, int key) {
int index = -1;
int max = length - 1;
int min = 0;
int mid = (max + min) / 2;
while (min &= max) {
if (myArray[mid] & key) {
max = mid - 1;
} else if (myArray[mid] & key){
min = mid + 1;
} else if (myArray[mid] == key) {
mid = (max + min) / 2;
int main(int argc, const char * argv[]) {
int myArray[] = {-3, 1, 7, 42, 88};
int length = sizeof(myArray) / sizeof(myArray[0]);
int index = binSearch(myArray, length, 88);
printf("index: %i ", index);
首先我假设index = -1,表示没有相应的值。接着获取max,min,mid的值,注意while循环的条件,在这里我用的是当min &= max的时候循环,当min & max时候跳出循环,说明并未找到key的值。在循环体里面,像刚才分析的那样判断,当myArray[mid] == key的时候说明我们找到了这个值,那么将index设置成找到值的下标,然后跳出循环。如果未找到值则index = -1。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具C语言中返回数组元素个数_百度知道
C语言中返回数组元素个数
int length(int a[]){return (sizeof(a)/}返回的数组元素个数为什么是1啊?;sizeof(a[0]))示例代码
我有更好的答案
sizeof(a[0])在32位系统上的的大小也是4,所以就是1了,所以这个时候实际上是把a当作一个int 指针处理的,所以如果你在程序里面这样来做:int a[] = {1,那么sizeof(a)实际上是指针的大小,这个在32位系统上是4,而a[0]是一个整数, 2, 3。但是你把int a[]作为参数传递到函数里面,编译时刻无法得知你要传送什么样的参数进去, 4, 5};int len = sizeof(a)/sizeof(a[0]);那么没有问题,可以正确的得出数组的长度,因为这个时候在编译时刻可以很容易的知道a有5个元素sizeof(a)的值是在编译时刻确定的
你说的我明白了,但是想要编写一个函数来获取一个数组的元素的个数,那又应该怎么去修改呢?
你需要额外的信息来辅助你完成这一个工作。举个例子就是C语言的字符串,我们知道C里面的字符串实际上就是以0结尾的字符数组,我们之所以可以使用strlen来获得字符串的长度就是因为我们知道0就是字符串的结束符,所以函数就可以从头扫描整个数组直到发现0的时候,所以可以得到字符串的长度。所以你也可以看看你的这个数组中是否有可能有一定不会出现的数字,比如-1或者-2^32 + 1之类的值,如果有的话,那么就可以以此作为结束符,用来判断数组长度;如果没有这样的永不回出现的数字可以用的话,那么你只能做点其他方面的工作了,比如强制规定数组的第一个元素就用来存放数组的长度之类的,那么每次想要知道数组长度就读取数组第一个元素就好,而真正的数据从数组第二个元素(也就是下标为1的时候)开始
采纳率:72%
4/4当然是1啦a是指向数组首地址的指针,长度为4,a[0]是int型,长度也是4数组不需要求长度,因为数组大小是不可变的,你肯定知道数组的大小c中的数组通常都是传入数组名和数组大小作参数处理
数组名作为函数的参数传入的时候数组名会退化成指针,所以sizeof(数组名)
= sizeof(一个指针变量)= 4;一个int型的数据也是4, 4/4 = 1。
sizeof是计算数据所占用的字节数,sizeof(a)数组名所代表的就是数组元素的首地址,即第一个元素a[0],原表达式就相当于sizeof(a[0])/sizeof(a[0])。答案当然是1啦
因为a是一个指针,而它存储的实际上是一个int型的整数索引值
数组作为参数的时候就退化成指针了,是4
其他2条回答
为您推荐:
其他类似问题
c语言的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。C语言中,计算数组元素个数的方法C语言中,计算数组元素个数的方法三体科技迷百家号上一篇文章中,我们介绍了,C语言中数组的相关知识。那么,如何计算数组中元素的个数呢?比如,当我们定义了这样一个数组:int array[10] = {1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10};虽然,我们能直接看出来,数组array有10个元素,但是,当我们写一段比较复杂的程序的时候,在程序中,要使用数组的个数时,直接写10,是不灵活的。因为:当我们要改变array的长度时,一处改了,则须处处改。我们最好是能够实现这样的效果:只在定义数组的时候,将array[10]改为array[11],其他地方,就自动改了。这个效果怎样实现呢?这就需要用到C语言运算符,同时也是C语言的一个关键字: sizeof这个关键字,可以计算出变量的长度。比如,如下程序所示:C语言计算数组长度,代码1上述C语言程序中,第7行,变量count所接收的值,就是数组array的元素个数。最终,程序结果如下:程序执行效果如果在第5行,我们更改了array的元素个数,那么后面的计算方法,也是不会变的:sizeof(array) / sizeof(array[0]);比如,如下程序所示:C语言计算数组长度,代码2我们看到,在上述C语言程序中,第5行,array[5]改为了array[6],下面第7行的计算方法,是不变的。这样,即使是在程序很多、很复杂的时候,我们也是只需要,更改第5行的地方就可以了。下面的程序,会自动计算出,数组的长度。第7行中,数组的长度,是动态计算出来的。而不是我们自己写上去的。比如:如果我们这样写: count = 5;那么,此处,如果第5行改为了array[6],那么第7行就也要改为: count = 6; 这样会很不方便。我们来总结一下:数组的长度,计算方法,主要是用到了sizeof这个关键字。它和C语言中的加(+)、减(-)、乘(*)、除(/)一样,也是属于C语言的一个运算符。当然了,这样看起来很奇怪:其他的运算符,都是一个符号;而sizeof这个运算符,却是C语言中的一个关键字。本文仅代表作者观点,不代表百度立场。系作者授权百家号发表,未经许可不得转载。三体科技迷百家号最近更新:简介:软硬件,手机数字,行业趋势,技术探索作者最新文章相关文章}

我要回帖

更多关于 php 求数组长度 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信