C language knowledge summary

String function

strcpy(字符数组,字符串);     //拷贝
strcat(字符数组,字符串); //拼接
strcmp(字符串1,字符串2); //比较
strlwr(字符串); //转小写
strupr(字符串); //转大写
strlen(字符串); //算长度
strncpy(字符数组,字符串1,n); //字符串1中前n个字符拷贝到字符数组

static:

  • 静态局部变量:

①定义时不赋初值,则编译时赋初值,自动赋初值为0,只赋值一次;

②函数调用结束后任然存在,其他函数不能引用,只能本函数引用。

  • 静态函数

又称内部函数,只能本文件使用。

extern

  • 外部变量声明

声明变量的作用域扩展到此位置(本文件);

  • 外部函数声明

本文件可使用外部声明的函数(默认值);

Tips:###

用数组元素作 实参时,向形参变量传递的是数组元素的值,而用数组名做函数实参时,向形参(数组名或者指针变量)传递的是数组元素的首地址

数组名 代表数组首元素的地址,它是一个指针型常量,它的值在程序运行期间固定不变,例如:

数组 a[10] = {1,2,3,4,5,6,7,8,9,10}; a++无法实现

指针变量p指向数组a的首地址: int *p = a; 则:

for (p = a; p< a + 10; p++)
printf("%d",*p)

实参数组名代表一个固定的地址,或者说是指针常量,但形参数组名并不是一个固定的地址,而是按指针变量处理

main函数中,数组a[5] = {1,2,3,4,5}; a为数组首地址,不能自加自减
(a++, a–)因为a为常量地址(指针常量),但可以a+i这样写, a[i] = *(a+i)始终成立

子函数(自定义函数中),数组形参传的是数组首地址,不检查数组长度,系统默认当指针处理,所以数组a可自加自减,(对指针操作);

指针变量必须先赋值,后使用,这样使用极其危险:
int *p; 然后直接使用*p

通过指针引用多维数组

a[3][4]

a: 首行首地址

a+1: 序号为1的行的首地址| a+1指向a[1],或者a+1的值是a[1]的首地址

a[i] 始终等价于(恒定于) * (a + i);


a[1] <===> *a+1;
a[0]+1 <===> *(a+0)+1 <===> &a[0][1];
a[1]+2 <===> *(a+1)+2 <===> &a[1][2];
*a[i]+j 或者 *(*(a+i)+j) <===> a[i][j]的值

通过指针引用字符串

  • 字符指针变量指向一个字符串常量; char *string = "I Love China!"

  • C语言中只有字符变量,没有字符串变量

  • 通过字符数组名或字符指针可以输出一个字符串,而对一个数字型数组,是不能用数组名输出它的全部元素,只能逐个输出。

  • 字符数组 vs 字符指针

    字符数组有若干元素组成,每一个元素中放一个字符,字符指针变量中存放的是地址。

    字符数组 => 数组名代表一个固定值(首元素地址)不能改变,各元素值可以再赋值。但只能定义时全部赋值,不能一次性赋值。

    字符指针 => 值可变,但指向的字符串为常量,不能修改。指针变量指向字串时,引用字符可使用: char *a = “I Love China!”; 则可使用 a[5]引用

函数指针

定义:编译系统为函数代码分配一段存储空间,这段存储空间的起始地址(入口地址)称为函数指针。

int (*p) (int, int)

函数指针作为函数参数,返回值等常见使用

typedef int (*PFUN)(int, int)PFUN p = NULL;

结构体

typedef struct {
char *name;
char name[20];
}

使用数组及指针的区别:

  • char *name 未分配存储空间;
  • 而数组名name是一个常量指针,已分配存储空间,赋值操作strcpy;

内存操作函数

  • free () 标记删除,不清除内容
  • memset ,memcpy, memcmp,均是按 字节 操作内存,既可以用于堆内存也可以用于栈内存。
char *name = (char *)malloc(sizeof(char)*20);
strcpy(name, "iPhone"); //已有存储空间
结构体中,如果包含指针,结构体分配内存中指针变量需要单独分配内存