1.指针的运算
指针与指针相减, 是计算的地址之间所指向的数据类型的个数
指针和指针不能相加
指针+1, = 指针 + sizeof(void)的地址
2.指针的申明和定义
2.1. 首先应该看是 *q 还是(*q)
例如 :unsigned char *q[20]: 本质是数组, 是指针的数组.{注}[]的优先级高于*
unsigned char (*q)[20]: 本质是指针,是一个指向unsinged char型的数指针
int*fun(int ): 本质是函数, 是一个返回值会指针的函数.
int(*fun)(int ): 本质是指针, 是一个指向int型函数的指针.
3.指针函数中,返回值千万不能是局部变量的地址
int *fun(int a,int b)
{
int *p;
int c;
c = a + b;
p = &c;
return p;
}
1.大错特错,函数调用位于栈区,函数退出后栈区销毁,指针会变为野指针.
虽然输出结果可能是对的,但是实际上返回的地址已经不受到保护,随时可能被擦出改变.这是很危险的.
static int c; //要想返回局部变量的地址,只有加上static,使这个变量位于静态区.
p = "helloe" ; //字符串常量
char *str = malloc(3); //动态存储区,地址在free后会失效
p = str;
2. 局部指针变量,只要指向的变量的生命期没有结束, 及时局部变量指针的生命期结束,这个地址也是有效的.
4.二级指针的使用
函数调用过程中,需要修改普通变量的值,需传递其地址,否则传递普通变量的值即可。
5.函数指针和指针函数的区别
5.1. 指针函数
本质上一个函数,一个返回值为地址的函数,因为返回值为指针,所以一般是int *
int *f(char a, char b);
int *p;
p = f;
5.2. 函数指针
本质上是一个指针,一个指向函数首地址的指针
char fun (char a, char b);
char (*p) (char a, char b);
p =fun;
p 指向了fun()函数的首地址
(注)函数名可以代表函数的地址.
5.3 函数指针的调用方法
handle func(); //函数定义
handle *p = func;
p(1,2) ==(*p)(1,2)== func(1,2)//函数调用
6.指针数组和数组指针的区别
6.1 指针数组
int*a[4] 指针数组
表示:数组a中的元素都为int型指针
元素表示:*a[i] *(a[i])是一样的,因为[]优先级高于*
6.2 数组指针
int (*a)[4] 数组指针
表示:指向数组a的指针
元素表示:(*a)[i]