指针是变量的一种,里面是一个地址,通过这个地址找到要寻找的数据
int *p = &a // p指向a, p代表a的地址
指针无论什么类型都是4个字节,一个字节8位,32位操作系统
段错误的原因:访问了不能访问的内存
int *p; //野指针,指向不能访问的地址
int *p = NULL; //空指针
p = &a; // p 是指针,将a 的地址赋给p
int *p, *pa = &a, *pb;
pb = pa; // 指针可以互相赋值
不同类型与零值比较
int if(n == 0)或者 if (n != 0)
float const float EPSINON = 0.00001;
if ((n >= -EPSINON ) && (n <= EPSINON ))
bool类型 if (flag)或者if (!flag)
指针类型 if (n == NULL)或者if (n != NULL)
(重点)malloc
#include <stdlib.h>
src = (char *)malloc(sizeof (char) * 20);
if(NULL == src)
{
perror("malloc")
}
free(src); // 从堆空间释放
src == NULL;
char * ; 不需要手动释放空间,位于栈空间
strlen(地址) //求长度
length = (sizeof(string) / sizeof(char *)); // 求char *string[]中的元素个数
宏函数
1.增加预处理时间
2.无入参判断(不安全)
自定义函数
劣:占用过多空间
优:有入参判断
typedef unsigned char uchar; // 定义unsigned char用 uchar 代替
typedef int(* FUNC)(int, int);
FUNC p;
<=>
int *p(int, int);
int *(*(*fp)(int))[10];
( * fp ) fp是一个指针
( *fp(int) )指向一个有一个参数为int型的函数
( *(*fp(int)) )函数的返回值是一个指针
( int * (*(*fp(int)) [10] )指针指向一个有10个元素的数组,每个元素的类型为int *型
int *(*(* array[5]())();
( *array[5] )array是一个有5个元素的数组,每个元素的类型是指针
( *( *array[5]() ) )指针指向一个没有参数的函数,函数的返回值为指针
( int * (*( *array[5] )() ) () )指针指向一个没有参数的函数,函数的返回值为int *类型