快速排序:
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,q);
qSort(begin,q - 1);
qSort(q + 1,end);
}
字符指针表示字符串
字符指针是一个变量,其值为字符类型数据的地址。可以使用字符指针来指向字符串的首字符,从而间接访问整个字符串。例如:
char *str = "Hello, World!";
这里 str 是一个字符指针,它指向字符串字面量 "Hello, World!" 的起始位置。
字符数组表示字符串
字符数组是一种特殊的数组,其元素类型为 char。字符串常量可以用来初始化字符数组,并且在初始化时,编译器会自动在字符串末尾添加空字符 '\0' 作为终止标记。例如:
char strArray[] = "Hello, World!";
在这个例子中,strArray 是一个字符数组,包含了字符串 "Hello, World!" 的所有字符,包括结尾的空字符 '\0'。
指向函数的指针
声明函数指针
函数指针的声明需要指定函数的返回类型和参数类型,其语法类似于函数声明,但需要在类型前加上 * 符号来表示这是一个指针。例如:
int *funcPtr(int, int);
迭代器
用 *begin表示数组的第一个元素,用 *end表示数组的最后一个元素
例如,用迭代器实现选择排序:
void choiceSort(int *begin,int *end)
{
while(begin < end)
{
int *p = begin + 1;
while(p <= end)
{
if(*begin > *p)
{
swap(begin,p);
}
++p;
}
++begin;
}
}
const:
const是一个类型限定符,用于表示对象不可修改。当应用于变量时,const关键字告诉编译器和程序员这个变量的值在初始化后不应该也不可以被改变。这有助于提高代码的可靠性和可读性,同时也可以避免意外修改变量的值,从而减少程序中的错误。
1.你可以使用const来定义变量,这些变量在程序执行过程中不会改变。例如:const int MAX = 100;
2.函数参数保护:当你传递参数给函数时,可以使用const关键字来保护这些参数不被函数修改。例如:
void print(const char *str)
{
// str不能在函数内部被修改
printf("%s\n", str);
}
3.数组和指针:const也可以用于指针,可以指定指针所指向的内容不能改变,或者指针本身不能改变(不能指向其他位置)。例如:
const int arr[] = {1, 2, 3};
int const *ptr = arr; // ptr指向的值不能改变,但ptr可以指向其他位置
int * const ptr2 = arr; // ptr2不能指向其他位置,但ptr2指向的值可以改变
动态内存分配:动态内存分配是指在程序运行时根据需要请求分配内存空间的过程。
malloc:用于分配指定大小的内存空间,并返回指向该空间的指针。如果分配失败,返回NULL。
realloc:用于调整已分配内存的大小,可以增加或减少内存块的大小。
free:用于释放由malloc、calloc或realloc分配的内存空间。
动态内存分配的注意事项
使用动态内存分配时,需要注意以下几点:
1.避免内存泄漏:确保每次分配的内存在不再需要时都被释放。
2.防止野指针:释放内存后,应将指针设置为NULL,以防止野指针的出现。
3.注意内存越界:在操作动态分配的内存时,不得超出分配的范围。
4.正确处理错误:检查malloc、calloc和realloc的返回值,以确保内存分配成功。