C/C++ 指针基本用法总结

声明:

TYPE *p (TYPE * p 和 TPYE* p 和 TYPE*p 都可以), * 号两边有无空格均可以,推荐第一种写法;

赋值:

既可以在声明的时候赋值,也可以在后期赋值,不要让没有赋值的野指针出现。指针不可以直接赋值常量,如 p=100 , 这时 *p 就会出错。

空类型指针和指向空的指针

  • 空类型指针可以接受任何类型指针,使用时将其强制转化为对应的数据类型即可。如:void *p;强转int型指针,(int*)p;
  • 指向空:int *p = NULL;

常量指针和指向常量的指针

  1. 常量型的指针: int * const p=&a, p 是常量,指向不能改,声明时得初始化,*p 可以改;
  2. 指向常量的指针:int const *p (同const int *p), *p 是常量,p可以改,不能通过*p来修改指向的内容;
  3. 指向常量的常量指针: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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值