C language knowledge summary
String function
strcpy(字符数组,字符串); //拷贝 |
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);
|
通过指针引用字符串
字符指针变量指向一个字符串常量;
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 未分配存储空间;
- 而数组名name是一个常量指针,已分配存储空间,赋值操作strcpy;
内存操作函数
- free () 标记删除,不清除内容
- memset ,memcpy, memcmp,均是按 字节 操作内存,既可以用于堆内存也可以用于栈内存。
char *name = (char *)malloc(sizeof(char)*20); |