目录
1. 使用指针的好处
(指针像是对一段范围内存的访问,可以直接操作内容)
2. 一些复杂指针声明
指针概念难学,并且容易与其他东西混淆
- 指针是一个类型
(1级中是后缀的自增与自减,2级是前缀的)
S:数组,H 函数,E 结构体 *&星宇
一些容易混淆的定义(根据优先级还判断)
*p++ ++的优先级高于*,先算p++再取值
&p++ 同理++的优先级高于&,先算p++再取地址
&stu.a . 的优先级高于&,先获得stu的成员变量,再取a的地址
int *a[10] []数组下标的优先级最高,a是一个长度为10的数组,数组中每个元素是一个指针,是指向整型的指针 【指针数组】
int (*a)[10] 从左到右的顺序,先算(*a)是一个指针,是一个指向长度为10的整型数组的指针【数组指针】
int *f(int) f是一个函数,函数的类型是函数的返回值,返回值是指向int的指针,是一个【指针函数】
int (*f)(int) 是一个函数指针,函数的类型是int【函数指针】
int *(*f)[10] (*f)是一个指针,int * [10] 剩下的部分就是在修饰指针的,指针指向的数组,数组元素是int型的指针
int *(*(*f)(int))[10]
(*f) 是一个指针
(*f)(int) 是一个函数指针,形参是int
(*(*f)(int))返回值是一个指针
int * [10] 返回值指针是一个指向int型指针数组的指针
使用右左法则
一层一层往外剥离
int (*(*f)(int,int))(int)
(*f)(int,int) : f是一个函数指针,参数是两个int类型
(*(*f)(int,int)) 返回值是一个指针
int (int) 修饰返回值的指针的:返回值的指针类型是一个函数指针,形参是int 返回值是int
3. 指针类型与运算
类型:一组数值与对这些数组的操作(感觉这个很抽象呢!)不同类型有不同的操作,例如char和float的区别
指针的运算
上图分别是char short int
p+1 == p+1*sizeof(type) 单位是byte
指针与指针相减
表示两个指针在内存中距离,以sizeof(type)为单位,不是以byte为单位
注意两个指针类型一定要一致
指针大小比较
在链表中很常见呢,遍历之类的
4. 逆序一个字符串
strlen有没有包括最后一个'\0'字符呢?
#include "stdio.h"
#include "string.h"
int main(void){
char a[20],tmp;
printf("input string:\n");
gets(a);
char *p,*q;
p=q=a;
p+=strlen(a)-1;
while(q<p){
tmp = *q;
*q++ = *p;
*p-- = tmp;
}
puts(a);
return 0;
}
tmp = *q;
*q++ = *p;
*p-- = tmp;