C语言笔记
字符串:
获取字符串长度:strlen (头文件string.h)
拷贝字符串:strcpy和strncpy (注:目标字符串长度足以容纳原字符串,后者限定拷贝字符串)
连接字符串:strcat和strncat (注:后者自动追加结束符)
比较字符串:strcmp和strncmp (比较:一致则返回0 不一致第一个的ASCII小于第二个字符则返回小于0的值,反之亦然 strncmp用于指定固定的比较字符个数)
二维数组:
array是指向包含5个元素数组的指针
*(array+1)==array[1]
*(array+i)=array[i]
(*p)[3]=array[2][3]
注:注意下标的取值范围,防止数组越界访问。只有第一维的元素个数可以不写,其他维度的必须写上。
指针:
指针变量:例如:char *pa; 指向字符型指针变量
int 4个字节
取地址运算符(&)
*p=&a
取值运算符( * )
printf("%d", *p)
%p打印地址类型数据
数组名是数组第一个元素的地址,第二个元素的地址为第一个元素的地址+每个元素所占空间
指向数组的指针:
当指针指向数组元素的时候,可以对指针变量进行加减运算,相当于指向距离指针所在位置向前或向后的第n个元素。
p+1不是地址+1,而是指向数组的下一个元素。
先将取到的值放到length里面,节约循环中调用函数所调用的时间
指针跟数组的区别:
指针数组与数组指针:
指针数组:指针数组是一个数组,每个数组元素存放一个指针变量 int *p[5]
数组指针:数组指针是一个指针,指向的是一个数组 int (*p)[5]
void指针:通用指针
注意:编译器不提醒,不必要不用,打注释
NULL指针:
#define NULL ((void *)0)
不清楚将U指针初始化为什么时,可初始化为NULL。
指向指针的指针(指针的地址):
int num = 520;
int *p = #
int **pp = &p;
printf("num: %d\n", num);
printf("p: %d\n", *p);
printf("**p: %d\n", **p);
指针数组和指向指针的指针:
好处:
- 避免重复分配内存
- 只需要进行一处修改
提高代码的灵活性和安全性
数组指针和二维数组:
常量:
使用const关键字可以将变量改为常量
指向常量的指针:
- 指针可以修改为指向不同的常量
- 指针可ui修改为指向不同的变量
- 可以通过解引用来读取指针指向的数据
- 不可以通过解引用修改指针指向的数据
常量指针:
const 接近哪个限制哪个为不可修改
int num = 520;
const int cnum = 880;
int * const p = #//常量指针 指向的值可以被改变
const int * const p = #//没有const时,int为普通变量,可以被修改
- 指向非常量的常量指针
- 指针自身不可以被修改
- 指针指向的值可以被修改
- 指向常量的常量指针
- 指针自身不可以被修改
- 指针指向的值也不可以被修改
指向“指向常量的常量指针”的指针:
const int * const **p = &p;//没有const时,int为普通变量,可以被修改
指针自身不可以被修改
2. 指针指向的值可以被修改
- 指向常量的常量指针
- 指针自身不可以被修改
- 指针指向的值也不可以被修改
指向“指向常量的常量指针”的指针:
const int * const **p = &p;//没有const时,int为普通变量,可以被修改