指针:
不论什么指针类型,指针的大小总是由机器位数决定,例如32位客户端指针占用4个字节
&:取地址 *:在定义时表示指针变量,在用时表示取值 p:p指向的地址 *p:p指向的地址值
&p:p本身的地址
int *p ;
*p = 3 ;
上述会出现段错误,修改了未定义的内存,指针指向不明
(*p)++与*p++、++*p的区别?
(*p)++指p指向内容,然后内容+1
*p++ 先求p指向的内容,然后指针指向地址向后挪一位
++*p 指p指向内容+1
malloc:申请空间(对于未赋初值的字符串变量,要想输入字符串,则必须向内存申请空间)
例如:
char *p ;
p = (char*)malloc(sizeof(char)*20)
表示字符指针p申请了一个20个字符长度的内存,并指向这个空间
指针与数组:
如果指针变量p指向数组中的元素,则(p+i)=(a+i)
char str[ ] = “i love china” 局部变量,栈空间
char *str = “helloworld” 常量,数据段空间,不可被更改
有参宏函数:
#define s(a,b) a*b
s(2, 3)=2*3
#define s(x)=x*x
int k=2, m=1;
s(k+m)=2+1*2+1 (一根筋替换)
宏函数优点:不占内存 ;缺点:没有入参判断,增加编译时间
函数指针:
int (*p)():表示一个指针,指向一个函数,函数没有形参,返回值为int型
例如
int (*p)(int, int);
p = add;
int add(int a,int b)
{
return a+b ;
}
printf("%d\n",p(3,5);
输出为8
判断int * ( * ( *fp ) ( int ) ) [10]
fp是一个指针,指向一个函数,函数有一个int类型的形参,函数的返回值是一个指针,指向一个有10个元素的数组,每个元素是一个指针