声明:
TYPE *p (TYPE * p 和 TPYE* p 和 TYPE*p 都可以), * 号两边有无空格均可以,推荐第一种写法;赋值:
既可以在声明的时候赋值,也可以在后期赋值,不要让没有赋值的野指针出现。指针不可以直接赋值常量,如 p=100 , 这时 *p 就会出错。空类型指针和指向空的指针
- 空类型指针可以接受任何类型指针,使用时将其强制转化为对应的数据类型即可。如:void *p;强转int型指针,(int*)p;
- 指向空:int *p = NULL;
常量指针和指向常量的指针
- 常量型的指针: int * const p=&a, p 是常量,指向不能改,声明时得初始化,*p 可以改;
- 指向常量的指针:int const *p (同const int *p), *p 是常量,p可以改,不能通过*p来修改指向的内容;
- 指向常量的常量指针:int const * const p =&a(同 const int * const p=&a), *p 和 p 都是常量;
- 如果const 修饰在*p前则 *p 不可变;
- 如果const直接写在p前则 p 不可变;
指向常量的指针:
/* 指向常量的指针 */
#include<iostream>
using namespace std;
int main() {
int a = 2;
int const *p; //等价于const int *p;
p = &a;
cout << p << endl;
int b = 3;
p = &b; //p仍可更改
cout << p << endl;
b = 5;
//*p=6; 编译错误,因为 不能通过*p来修改内容
cout << *p << endl;
}
输出:
0x28fed8 0x28fed4 5
常量型的指针:
/* 指针常量,常量型的指针 */
#include<iostream>
using namespace std;
int main() {
int a = 2;
int * const p = &a; //必须初始化,否则编译不过
cout << p << endl;
int b = 3;
//p = &b;本行错误,不能再给p赋值
*p=3;
cout<<a<<endl;
}
输出:
0x28fed4 3
函数指针与指针函数
函数指针指向函数内存的指针,一个函数编译时被分配给一个入口地址,可以用一个指针变量指向函数,然后通过指针变量调用次函数。
用例: int add(int x,int y);
int (*p_f)(int,int); 或 int (*p_f)(int x,int y); 注意小括号
指针函数指返回值是指针的函数,定义: TYPE * 函数名(参数列表);
函数指针:
#include<stdio.h>
int add(int a, int b);
void show();
int main() {
int (*pf)(int, int); // 等价于 int (*pf)(int a, int b);
/* 函数指针变量的声明格式类似于函数声明,把名称换成(*p_fun)即可 */
pf = add; // 等价于 pf = &add;
int c = (*pf)(2, 3);
printf("%d\n", c);
show(); // 等价于(*show)(),show其实是其入口地址,相当于函数指针常量;
void (*fs)() = show;
(*fs)();
return 0;
}
int add(int a, int b) {
return a + b;
}
void show() {
printf("show\n");
}
输出:
5 show show