您的位置:首页 > 编程语言 > C语言/C++

【C】【笔记】《C和指针》 第六章 指针 第七章 函数 第八章 数组 第九章 字符串、字符和字节

2015-11-08 18:40 337 查看
数组中的元素存储与连续的内存位置中,后面元素的地址大于前面的元素的地址。

C的指针算术运算只限于两种形式。
第一种是 指针±整数
第二种是 指针-指针 仅限于两个指针都指向同一个数组中的元素
结果的类型是ptrdiff_t,是一种有符号整数类型。减法运算的值是两个指针在内存中的距离(以数组元素的长度为单位,而不是以字节为单位),因为减法运算的结果将除以数组元素类型的长度。

ANSI C表示,在同一个代码块中,函数原型必须与同一个函数的任何先前原型匹配,否则编译器应该产生一条错误信息。

所有的函数都应该具有原型,尤其是那些返回值不是一个整型的函数。

不要迷信递归。在诸如阶乘与fibonacci数列的问题上递归算法的效率是非常低的。

可变参数列表是通过宏来实现的,这些宏定义于stdarg.h头文件中,它是标准库的一部分。这个头文件声明了一个类型va_list和三个宏——va_start、va_arg和va_end。我们可以声明一个类型为va_list的变量,与这几个宏配合使用,访问参数的值

sizeof 数组名 返回整个数组的长度,而不是指向数组的指针的长度。取一个数组名的地址所产生的是一个指向数组的指针,而不是一个指向某个指针常量值的指针。

数组名是一个指针常量。

根据某个固定数目的增量在一个数组中移动时,使用指针变量将比使用下标产生效率更高的代码。当这个增量是1并且极其具有地址自动增量模型时,这点表现的更为突出。

声明为寄存器变量的指针通常比位于静态内存和堆栈中的指针效率更高。

如果可以通过测试一些已经初始化并经过调整的内容来判断循环是否应该终止,那么就不需要使用一个单独的计数器。

那些必须在运行时求值的表达式较之注入&array[size]或array+SIZE这样的常量表达式旺旺代价更高。

strcpy:复制字符串
char *strcpy(char *dst,char const *src);

strcat:连接字符串
char *strcat(char *dst,char const *src);

strcmp:字符串比较
int strcmp(char const *s1,char const *s2);

strlen返回一个类型为size_t的值。这个类型是在头文件stddef.h中定义的,是一个无符号整数类型。

strcpy和strcat都返回他们第1个参数的一份拷贝,就是一个指向目标字符数组的指针。由于它们返回这种类型的值,所以你可以嵌套的调用这些函数。

strncpy把源字符串的字符复制到目标数组。它总是正好向dst写入len个字符。如果strlen(src)的值小于len,dst数组就用额外的NUL字节填充到len长度。如果strlen(src)的值大于或等于len,那么只有len个字符被赋值到dst中。注意!它的结果将不会以NUL字节结尾。
strncpy调用的结果可能不是字符串。
char *strncpy(char *dst,char const *src,size_t len);

strncat从src中最多复制len个字符到目标数组后面。但是,strncat总是在结果字符串后面添加一个NUL字节,而且它不会向strncpy那样对目标数组用NUL字节进行填充。目标数组中原先的字符串并没有算在strncat的长度中。
char *strncat(char *dst,char const *src,size_t len);

in strncmp(char const *s1,char const *s2,size_t len);

strchr在字符串str中查找字符ch第1此出现的位置,找到后汉书范湖一个指向该位置的指针。如果该字符并不存在于字符串中,函数就返回一个NULL指针。strrchr的功能和strchr基本一致,只是它所返回的是一个指向字符串中该字符最后一次出现的位置(最右边的)
char *strchr(char const *str,int ch);
char *strrchr(char const *str,int ch);

strpbrk 查找任何一组字符第1次在字符串中出现的位置。
char *strpbrk(char const *str,char const *group);
这个函数返回一个指向str中第一个匹配group中任何一个字符的字符位置。如果未找到匹配,函数返回一个NULL指针。

strstr查找子串
char *strstr(char const *s1,char const *s2);

strspn 和strcspn函数用于在字符串的起始位置对字符计数
size_t strspn(char const *str,char const *group);
size_t strcspn(char const *str,char const *group);
group字符串指定一个或多个字符。strspn返回str起始部分匹配group中任意字符的字符数。
strcspn函数和strspn函数正好相反,它对str字符串起始部分中捕鱼group中任何字符匹配的字符进行计数。

strtok从字符串中隔离各个单独的成为标记(token)的部分,并丢弃分隔符。
char *strtok(char *str,char const *sep);
sep参数是个字符串,定义了用作分隔符的字符集和。第1参数指定一个字符串,它包含另个或多个由sep字符串中一个或多个分隔符分隔的标记。strtok找到str的下一个标记,并将其用NUL结尾,然后返回一个指向这个标记的指针。
当strtok函数的执行任务时,它将会修改它所处理的字符串。如果源字符串不能被修改,那就复制一份,将这份拷贝传递给strtok函数。

strerror函数把请求系统操作执行一些功能出现的错误代码作为参数并返回一个指向用于描述错误的字符串的指针。
char *strerror(int error_number);

字符分类函数:每个分类函数接受一个包含字符值的整形函数。函数测试这个字符并返回一个整型值,表示真或家

函数如果它的参数符合下列条件返回真
iscntrl任何控制字符
isspace空白字符:空格‘ ’,换页‘\f’,换行'\n',回车'\r',制表符'\t'或'\v'
isdigit十进制数字0~9
isxdigit十六进制数字,包括所有十进制数字,小写字母a~f大写字母A~F
islower小写字母a~z
isupper 大写字母A~Z
isaalpha字母a~z或A~Z
isalnum字母或数字
ispunct标点符号,任何不属于数字或字母的图形字符(可打印符号)
isgraph任何图形字符
isprint任何可打印字符,包括图形字符和空白字符
toupper函数返回其参数的对应大写形式,tolower函数返回其参数的对应小写形式。
int tolower(int ch);
int toupper(int ch);

内存操作
内存操作函数与字符串函数类似,但这些函数能够处理任意的字节序列(包含NUL)
void *memcpy(void *dst,void const *src,size_t length);
void *memmov(void *dst,void const *src,size_t length);
void *memcmp(void const *a,void const *b,size_t length);
void *memchr(void const *a,int ch,size_t length);
void *memset(void *a,int ch,size_t length);
每个原型都包含一个显示参数说明需要处理的字节数,但和strn带头的函数不同,他们在遇到NUl字节时并不会停止操作。
memecpy从src的起始位置复制length个字节到dst的内存起始位置。可以用这种方法赋值任何类型的值,第3个参数指定复制值的长度(以字节计)。
memmove的行为和memcpy差不多,只是它的源和目标操作数可以重叠。
memcmp对两端内存的内容进行比较,这两段内存分别起始于a和b,共比较length个字节。这些值按照无符号字符逐字节进行比较,函数的返回类型和strcmp函数一样——负值表示a小于b,正值表示a大于b,零表示a等于b。由于这些值是根据一串无符号字节进行比较的,所以如果memcmp函数用于比较不是单字节的数据如整数或浮点数时就可能给出不可预料的结果。
memchr从a的只是位置开始查找字符ch第1次出现的位置,并返回一个指向该位置的指针,它共查找length个字节。如果在这length个字节中未找到该字符,函数就返回一个NULL指针。
memset函数把从a开始的length个字节都设置为字符值ch。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息