C/C++中指针与const、指针与数组、指针与函数的关系

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;	
} 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值