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;
pi = 0;
cout << "*p = " << *p << endl;
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* 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 是一个指针,然后才是一个指向函数的指针。
函数指针的赋值有两种方式:
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;
}
|