1.一维数组
1.1遍历
不使用局部变量,使用迭代器作为函数参数,下例:遍历去头去尾的数组a[]
不使用循环也不使用局部变量,要使用递归
1.2逆序
递归:
1.3选择排序
1.4二分查找法
1.5快速排序
1.找一个基准数——t;
2.从右至左找第一个比基准数小的数——q的新地址;
3.从左至右找第一个比基准数大的数——p的新地址;
4.交换p、q;
5.循环,直到p、q相遇;
6.交换基准数与p(q)的位置;
得到的数组左边都比基准数小,右边都比基准数大,然后把前后分开,递归,直到数组排除顺序。
注意:递归一定要有停止条件!如下例的:if(begin > end){return;}
void qSort(int *begin, int *end)
{
if(begin > end)
{
return ;
}
int t = *begin;
int *p = begin;
int *q = end;
while(p < q)
{
while(p < q && *q >= t)
{
--q;
}
while(p < q && *p <= t)
{
++p;
}
swap(p, q);
}
swap(begin, p);
qSort(begin, p - 1);
qSort(p + 1, end);
}
2.字符串
2.1
char s[100] = "Hello";
char *p;
p = "Hello World!";//此处赋值赋的是字符串首元素的地址,即“H”的地址
数组不能这么赋值,因为数组不能整体引用;
如果*p = 'A';puts(p) 则程序会崩溃,因为字符串常量不能更改,它在字符串常量区,而p在栈区
但p = s;*p = 'A';puts(p) 则会输出“Aello”
2.2const
const加在指针变量前,表示无法通过该指针去修改它所指向的变量,即const修饰的是*p,而非指针变量p;如:int i = 10;const int *p;p = &i可以,但*p = 100不行
而const在其它变量前则表示该变量无法修改;
int * const p 则表示p无法修改,即p = &i不行,但*p可以修改;
加不加const要看函数有没有必要通过指针去修改所指向变量的内容,能加const尽量加const;
2.3字符串遍历
2.4输出字符串有效字符个数
没有循环和局部变量的,递归(一般不使用,效率低,占内存)
2.5把字符串2拷贝给字符串1
把字符串2前n个字节拷贝给字符串1
n > *src的长度也只拷贝*src,不会越界,所以循环条件有n != 0;
2.6字符串连接
把源字符串的前n个字节连接在目标字符后
2.7字符串大小比较
比较源字符串和目标字符串前n个字节的大小;
注意--n放在while循环语句中,因为字符串的第一个元素对应的位置是0,而字节则是从1开始;
size_t n 表示前n个字节
2.8万能指针
void *p p可以接受任何类型的地址,但是p不能进行指针运算,因为运算后为void型,C语言中不能有void型变量。
万能指针主要作用是用来强制类型转换,如下的strncat,则可以把任意类型的字符串连接。