C/C++指针
1. 指针与const
1.1 指向const的指针
声明:const 类型 *指针名 = 地址;
const int *p = &a;
从声明语句可以看处,const
修饰的是int
,并不会对指针p
造成影响,因此指针变量p
的值可以改变即指向可以改变,而const int
表示整型常量,因此p指向的对象是整型常量。
对指针而言,指向可以变,而不能改变对象的值。
const float PI = 3.1415;
const float* p = Π //常规使用
注意:指向常量是针对指针本身而言,实际上指向的对象本身可以是一个常量或者变量,只是不能通过指针来改变对象的值!
float pi = 3.14;
p = π
cout << "*p = " << *p << endl; //输出结果为 *p = 3.14
//p = 0; //指向常量的指针不能改变对象的值
pi = 0;
cout << "*p = " << *p << endl; //输出结果为 *p = 0
1.2 指针常量
声明: 类型* const 指针名 = 地址;
int* const p = &a;
从声明语句看, const
修饰的是指针p
,表明指针p
是常量,因此其指向不能修改,而且需要在声明的时候初始化。而指向的对象是一个int
整型变量,可以通过指针来改变对象的值。
对指针而言,指向不能变,但可以改变对象的值。
1.3 指向常量的指针和指针常量对比
类型 | 声明 | 指向 | 通过*p改变对象的值 |
---|---|---|---|
指向常量的指针 | const int* p = &a; | 可改变 | 不可以,因为const修饰的是int对象 |
指针常量 | int* const p = &a; | 不可改变 | 可以,因为const修饰的是指针,对象不受限制 |
2. 指针与数组
2.1 指针数组
声明:类型 *数组名[数组长度] = {数组元素};
char *arr[2] = {'a', 'b'};
优先级[]
大于*
,因此arr
先被数组运算符[]
修饰,表明 arr
是一个数组 ,然后才是数组元素为指向char类型指针的数组。
相当于:
char *(arr[2]) = {'a', 'b'};
2.2 数组指针
声明:类型 (*指针名)[数组长度];
char (*p)[4];
优先级()
大于[]
,因此p
先被指针运算符*
修饰,表明 p
是一个指针 ,然后才是一个 指向长度为4的数组的指针 。
3. 指针与函数
3.1 指针函数
声明: 类型* 函数名(参数表);
int* fun(int a, int b);
表示返回值为指针的函数。由函数的定义可以知道,这种写法表示返回值为==int*
==类型的变量即指针。
也可以用优先级来看,()
的优先级大于*
,因此fun
先是函数,然后才是返回值为int*
类型的指针的函数。
int* f(int a, int b); // 声明指针函数
int main(int argc, char* argv[])
{
int *p1 = NULL;
printf("The memeory address of p1 = 0x%x \n", p1);
p1 = f(1, 2);
printf("The memeory address of p1 = 0x%x \n", p1);
printf("*p1 = %d \n", *p1);
return 0;
}
/*
* 指针函数的定义
* 返回值是指针类型int *
*/
int* f(int a, int b) {
int *p = (int *)malloc(sizeof(int)); //申请动态内存
printf("The memeory address of p = 0x%x \n", p);
memset(p, 0, sizeof(int));
*p = a + b;
return p;
}
3.2 函数指针
声明:类型 (*函数名)(参数表);
int (*p)(int a, int b);
由于两边都加了()
,因此优先级一致,结合方向为从左到右,因此从左到右先是*p
修饰,所以p
是一个指针,然后才是一个指向函数的指针。
函数指针的赋值有两种方式:
//假设有一个函数名为:function()
p = function; //方法一
p = &function; //方法二
函数指针的调用有两种方式:
result = p(); //方法一
result = (*p)();//方法二
例示:
#include <stdio.h>
int max(int a, int b){ return a > b ? a : b;}
int min(int a, int b){ return a < b ? a : b;}
int main()
{
int result = 0;
int (*p)(int, int); //声明函数指针
//第一种赋值与调用方法
p = max; //函数指针赋值
result = p(100, 10);//函数指针调用
printf("p=max运算:%d\n", result);
//第二种赋值与调用方法
p = &min; //函数指针赋值
result = (*p)(100, 10); //函数指针调用
printf("p=min运算:%d\n", result);
return 0;
}