Linux 学习笔记6

1.数组

  • 常数表达式中可以包括常量和待号常量,不能包括变量。

  •  数组必须先定义,后使用。
  • C规定只能逐个引用数组元素,而不能一次引用整个数组。
  • 字符数组可以整体引用。
  • 在数组的引用中,其下标值必须要落在0与n-1之间一一越界错误!
    下标越界也不自动监测。
  • 不定长初始化:char [ ]={"hello"} ,多在字符数组使用
  • 当数组被说明为静态(static)存储类型或外部存储类型(即在所有函数外部定义)时,则在不显式给出初值的情况下,数组元素将在程序编译阶段自动初始化为0。

        static int a[4]   等价于

        static int a[4]={0,0,0,0}

2.冒泡排序

#include <stdio.h>


int main(int argc, const char *argv[])
{
	printf("请输入10个数:");
	int a[10];
	int i,j,tmp;
	for(i=0;i<sizeof(a)/sizeof(a[0]);i++)
	{
	scanf("%d",&a[i]);
	}
	for(i=0;i<(sizeof(a)/sizeof(a[0]))-1;i++)  //n个数,需要n-1趟排序。
	{
		for(j=0;j<(sizeof(a)/sizeof(a[0])-1-i);j++) //每一趟比较都会确定较大值,
//第i趟比较就会减去i个已确定的较大的数
		{
			if(a[j]<a[j+1])
			{
				tmp=a[j];
				a[j]=a[j+1];
				a[j+1]=tmp;
			}
		}
	}
	
	for(i=0;i<(sizeof(a)/sizeof(a[0]));i++)
	{
		printf("%d  ",a[i]);
	}
	putchar(10);


	return 0;
}

3.斐波那契数列

#include <stdio.h>


int main(int argc, const char *argv[])
{
	int f1=1,f2=1,f3;
	int i;
#if 0
	printf("%12d\n%12d\n",f1,f2);
	for(i=1;i<=38;i++)
	{
		f3=f1+f2;
		printf("%12d\n",f3);
		f1=f2;
		f2=f3;
	}
#endif
	for(i=1;i<=20;i++)
	{

	    printf("%12d%12d",f1,f2);
		if(i%2==0)
		{
			printf("\n");
		}
		f1=f1+f2;
		f2=f2+f1;
	}



	return 0;
}

4.二分法查找

#include  <stdio.h>
main( )
{int  up=9, low=0, mid, found=0, find;
  int  a[10]={1, 5, 6, 9, 11, 17, 25, 34, 38, 41};
  scanf(〞%d 〞,  &find);
  printf(〞\n 〞);
  while (up>=low  &&  !fount)
       {mid=(up+low)/2;
         if(a[mid]==find)
             {found=1;  break;}
         else  if(a[mid]>find)
              up=mid-1;
         else    low=mid+1;
        }
  if(found)  printf(〞found  number  is  %dth 〞mid);
  else  printf(〞no  found 〞);
}

5.一维数组名作函数参数

  • 使用简单变量作函数参数,能由实参向形参传递一个数据。使用数组名作函数参数,属于“地址调用”能由主调函数向被调函数传递数组的首地址,并能由被调函数向主调函数传递多个数据。
  • 传递方式:

    属于赋地址调用,将实参数组首地址

    传给虚参,虚参也是一数组名。

  • 虚参要求

        必须是数组名。

  • 实参要求

        可为另一数组名。

  • 哑实结合

        哑实数组具有相同的首地址,即哑实

        数组第一个元素占用同一存储单元,

        以后各元素按顺序一一结合。

6.一维数组名作参数的说明

1.用数组名作函数参数时,应该在主调函数和被调函数分别定义数组-实参数组、形参数组。不能      只在一方定义,并且 实参数组与形参数组类型必须一一致。

2.在被调函数中声明的形参数组的大小n,实际上不起任何作用,因为C编译对形参数组的大小不做检查,只将实参首地址传给形参数组。一维数组方括号内可以不写,二位数组只能省

3.实参数组和形参数组,既可同名,也可不同名。因它们的数组名代表的是数组的首地址。所以经过“由实参向形参的单向值传递”后,它们便指向了内存中的同一段连续的存储单元。

4.若在被调函数中改变形参数组的元素值,则实参数组中的元素值也会随之发生改变。注意这种改变不是形参传给实参造成的( C语言不允许这种反向的值传递)而是由于形参和实参两个数组在内存中因指向同一地址而共享同一段内存造成的。

7.二维数组名作参数的说明

规定:如果将二维数组作为参数传递给函数,那么在函数的参数声明中必须指明数组的列数,数组的行数没有太大关系,可以指定也可以不指定。因为函数调用时传递的是一个指针,它指向由行向量够成的一维数组。因此二维数组作为函数参数正确写法如下所示:   

void Func(int array[3][10]); 

void Func(int array[ ][10]);

因为数组的行数无关紧要,所以还可以写成如下形式:

void Func(int (*array)[10]);  注意*array需要用括号括起来。

这种形式的声明参数是一个指针,它指向具有10个元素的一维数组。因为[]的优先级比*的优先级高,故*array必须用括号括起来,否则变成了

void Func(int *array[10]);

这时候参数相当于是声明了一个数组,该数组有10个元素,其中每个元素都是一个指向整型对象的指针。

但是不能把第二维或者更高维的大小省略,如下面的定义是不合法的:

 void Func(int array[ ][ ]);

  因为从实参传递来的是数组的起始地址,在内存中按数组排列规则存放(按行存放),而并不区分行和列,如果在形参中不说明列数,则系统无法决定应为多少行多 少列,不能只指定一维而不指定第二维,下面写法是错误的: 

void Func(int array[3][ ]);

  实参数组维数可以大于形参数组,例如形参数组定义为: 

 void Func(int array[3][10]); 

而实参数组定义为:int array[5][10];     进行函数调用Func(array)时,由于数组在内存中是连续存放的,虽然形参与实参数组行数不对应,但是列数是相同的,具有相同的起始地址,这样可以访问到后续的值

#include <stdio.h>

void print_array(int *array, int len)
{
    int i = 0;
    for ( ; i < len; i++) {
        printf("%d ",array[i]);
    }
    putchar('\n');
}

void func(int array[3][10])
{
    print_array(array[0], 10);
    print_array(array[1], 10);
    print_array(array[2], 10);
    print_array(array[3], 10);
    print_array(array[4], 10);
}

int main()
{
    int array[5][10] = {
        {0,1,2,3,4,5,6,7,8,9},
        {10,11,12,13,14,15,16,17,18,19},
        {20,21,22,23,24,25,26,27,28,29},
        {30,31,32,33,34,35,36,37,38,39},
        {40,41,42,43,44,45,46,47,48,49}
    };
    func(array);
    return 0;
}

8.字符数组

  • 1.字符串是采用字符数组来表示的,只是在有效字符串后自动加字符串结束标志'\0'。
  • 2.字符数组不是字符串,只有当字符型一维数组中的最后一个元素值为’\0’时,它才构成字符串。
  • 3.对于一个字符串常量,那么这个字符串常量本身代表的就是该字符串在内存中所占连续存储单元的首地址,是一个地址常量 。
  • 4.如果将字符串赋值给了一个一维数组,那么这个一维数组的名字就代表这个首地址。
  • 5.如果一个字符数组中包含一个以上的   ‘\0’,则遇第一个'\0'时就结束 。

'a':返回阿斯玛值

"a":返回字符串地址

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值