IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C/C++中指针与const、指针与数组、指针与函数的关系 -> 正文阅读

[C++知识库]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;	
} 
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-12-15 18:05:37  更:2021-12-15 18:07:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 12:20:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码