数组
用指针访问数组
用指针遍历数组,效率更高。
for(p=a;p<&a[MAX]'p++)
{
x=*p;
/*do something*/
}
不可以用sizeof获得数组大小
while(*strings)
{
puts(*strings++);
}
void f(char a[12])
{
++a;
}
指针
理解指针时,最好将其分为 指针类型 和 指针所指向的类型 两个概念来理解
int (*ptr) [3] 指针类型: int(*)[3] 指针所指类型:int()[3]
int *(*ptr)[4] 指针类型: int*(*)[4] 指针所指类型:int*()[4]
指针本身占据4个字节的长度(32位)
指针的运算
常量指针 和 指针常量
(1)const char* p; //char const * p;
常量指针,const char 是常量,这是一个指向常量的指针,指针本身可以修改,但内容不能修改,即*p='b'
非法,而 p=&q
合法。可用于strlen 和 strcpy。
(2)char* const p=a;
指针常量,const p 是常量,指针的内容可以修改,但指针本身不能修改,即p=&q
非法,而 *p='b'
合法
(3)char* p="abc";
定义了一个指针变量,指向字符串abc 的首地址,但“abc”是一个常量字符串,被存在静态存储区的常量存储区,而p是一个指针,存在栈中,所以*p='b'
编译时可以通过,但运行时会出现错误。
指针数组 和 数组指针、
(1)char *p[n];
指针数组,包含了n个指针变量p[0],p[1],p[2]…
(2)char (*p)[n];
数组指针,定义了一个指向n个数据元素的二维数组指针。
p = &(p[0]) p是二维指针
p[0] = &(p[0][0]) p[0]是一维指针
p[0] + 1表示在列上移动。 e.g: p[0] + 1 = &p[0][0] + 1 = &p[0][1]
p + 1 表示在行上移动。 e.g: p + 1 = &(p[0]) + 1 = &p[1]
https://blog.csdn.net/Helloo_jerry/article/details/80340936
函数指针 和 指针函数
(1)数据类型 (*fun) (参数列表);
void (*fun)(int*,int*);
函数指针,变量有地址,函数同样也有地址
第一步:定义函数指针,int (*pfun)(int*,int*);
第二步:定义函数,int fun(int*,int*);
第三步:把函数地址赋给函数指针,pfun=fun;
第四步:通过函数指针去调用这个函数“(*pfun)(p,q)”,pfun是函数地址,*pfun是函数本身
(2)数据类型 *fun (参数列表)
char *fun(int*,int*)
指针函数,尽量用全局变量的指针,因为局部变量会释放掉。
空指针NULL
常用于判断
泛指针void
当进行纯粹的内存操作时,或者传递一个未定类型的指针时,可以使用void指针,void指针也经常用作函数指针。