C++指针

什么是指针变量

一个变量的地址称为该变量的指针
指针变量是一种存储被指向变量地址的特殊变量。
指针变量的声明方式:基类型 * 变量名;
指针工作方式:指针只存储一个地址,指针的基类型决定了取多少字节的数值,比如int * pint;pint中存储的为内存地址,而int类型决定了取四个字节。
指针的赋值:

  1. 定义时赋值:存储类型(默认auto) 基类型 * 变量名 = 初始地址;
  2. 指针变量赋值:指针变量名 = &变量名;


指针基础应用

指针的声明、赋值与使用
#include <iostream>
using namespace std;
int main() {
	int i;			//定义int型数i
	int *ptr = &i;	//取i的地址赋给ptr
	i = 10;			//int型数赋初值
	cout << "i = " << i << endl;
					//输出int型数的值
	cout << "*ptr = " << *ptr << endl;
					//输出int型指针所指地址的内容
	return 0;
}

常量指针与指针常量

常量的指针,可以理解为定义了一个指针指向常量。当指针变量作为变量时(* point)不可以修改(此时为常量),当指针变量作为指针时(point)可以修改

	int a, b;
	const int *p1 = &a;	//p1是指向常量的指针
	p1 = &b;			//正确,p1指向的地址可以改变
	*p1 = 1;			//编译时出错,不能通过p1改变所指的对象

指针常量(常量类型的指针)

	int a;
	int * const p2 = &a; 
	*p2 = 10;	//正确,p2指向的地址不能改变,但p2指向地址的值可以改变
	p2 = &b;	//错误,p2是指针常量,指向的地址不能改变



指针与数组

使用指针操作数组

       指针指向数组时,实际上是指向数组的首地址。需要注意的是,指向数组的指针可以进行自加运算,但不可对数组首地址进行自加运算。

	int a[10], *pa;		
	pa=&a[0];	//或 pa=a;
	cout << (*(pa+1) == a[1]);	//表达式值为真
	cout << ((pa+2) == &a[2]);	//表达式值位真
	pa++;		//指向数组下一位
	a++;		//错误,数组首地址为常量。

指针数组与二维指针

指针数组:由指针变量组成数组,每个元素都是同类型的指针变量。
二维指针:指针指向二维数组。二维数组在内存中存储时,是按照一维数组存储的,因此可以使用一维数组的方式进行访问。

#include<iostream>

using namespace std;

int main() {
	int a[][3] = { {0,1,2},{3,4,5},{6,7,8} };	//定义二维数组
	int * p = a[0];			//定义指针变量,指向一维数组
	int * p1a[3] = { a[0],a[1],a[2] };	//定义指针数组
	int(*p2a)[3] = a;		//定义二维数组指针变量

	cout << "指针数组:" << endl;
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++)
			cout << "a[" << i << "][" << j << "]:" << p1a[i][j] << "  ";
		cout << endl;
	}

	cout << "二维数组指针(矩阵):" << endl;
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++)
			cout << "a[" << i << "][" << j << "]:" << (*p2a + i * 3)[j] << "  ";
		cout << endl;
	}

	cout << "二维数组指针(行):" << endl;
	for (int i = 0; i < 9; i++) {
		cout << "a[" << i << "]" << *(*p2a + i) << "  ";
	}

	
	return 0;
}

指针数组、二维指针运行结果



指针函数

函数在编译时会被分配一个入口地址,函数指针指向这个函数入口地址。
函数指针的声明:函数类型 (*指针名) (函数形参列表); 例如int (*max) (int, int);

#include<iostream>

using namespace std;

int max(int a, int b);

int main() {
	int a, b, m;
	int(*pFunc)(int, int);

	pFunc = max;
	cin >> a >> b;

	m = pFunc(a, b);
	cout << "Max = " << m << endl;

	return 0;
}

int max(int a, int b)
{
	int tmp = a;
	if (a < b)
		tmp = b;
	return tmp;
}

指针函数运行结果



指向指针的指针

#include<iostream>
#include<string>

using namespace std;

int main() {
	const char *name[] = { "BASIC","COBOL","C++" };
	const char **p;
	
	p = name + 2;

	cout << *p << endl;
	cout << **p << endl;
	
	return 0;
}

指向指针的指针运行结果

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值