遇到什么有价值的便记录下来,持续更新~
1.函数只用一个返回值(单一出口原则),结构清晰,便于修改
2.一个变量既是循环遍历的变量又是条件判断的变量(一专多能是不好的代码)
3.线性搜索没有效率,二分法效率极高,次数为log2 n
4.数组的大小 sizeof给出整个数组所占据的内容的大小,单位是字节 sizeof(a[0]给出数组中单个元素的大小,于是相除就得到了数组的单元个数 //这样的代码,一旦修改数组中初始的数据,不需要修改遍历的代码(安全)
int a[]={0,1,2,3,5};
int length = 0;
length = sizeof(a) / sizeof(a[0]);
printf("main_数组的长度为: %d\n",length);
注:传入函数参数表的数组其实是一个指针 (所以应该直接传值,如:sum(a,length);) //不能在sum()函数里使用, 其中传递的数组参数和常量指针一样,如: sizeof(a)=4字节//实际上是在32位编译环境的int型一个指针大小 (32位操作系统,一个字节刚好是8位,因此是4个字节) 即sizeof(a)==sizeof(int*)
但是仍然可以用数组的运算符[]进行运算
以下四种函数原型是等价的:
int sum(int *a,int n);
int sum(int *,int );
int sum(int a[],int n);
int sum(int [],int );
总结: sizeof(数组名):返回数组所有元素占有的内存空间字节数。 sizeof(指针) :返回计算机系统的地址字节数,如果是32位系统,返回4,16位系统返回2。
5.&边上必须是明确的变量 &(a+b)不可取 内存是堆栈分配,自小变大的,比如int类型 int a[10]; a[0]0x000004与a[1]0x000008相差4
6.int* p,q;与int *p,q;表达意思一样 其中p(星p)为指针,q为int型变量 指针变量不能放实际值,只放别的(整型)变量的地址
7.数组变量本身表达地址,所以: int a[10]; int *p=a;//不需要用&取地址 但数组的单元表达的是变量,需要用&取地址 a==&a[0]
[]运算符可以对数组做,也可以对指针做:
p[0]<==>a[0]
{
int *p=&min;
*p==p[0]
}
*运算符可以对指针做,也可以对数组做: *a=25;//可以读、写值 数组变量是const(常量)的指针,所以不能被赋值 两个数组之间不能直接赋值
int b[] <==>int * const b
int *q=a;
|