首页 > 编程语言 >C++指针

C++指针

时间:2023-04-09 23:55:17浏览次数:50  
标签:const 常量 指向 int C++ 修饰 指针

指针

指针的基本概念

1、指针的作用:可以通过指针间接访问内存 (指针就是内存地址

  • 内存编号是从0开始记录的,一般 用16进制数字表示
  • 可以利用指针变量保存地址

指针变量定义的语法

#include <iostream>
using namespace std;



int main() {
	// 1、定义指针
	int a = 10;
	// 指针定义的语法:数据类型 * 指针变量名;
	int* p;
	// 让指针记录变量a的地址
	p = &a;
	cout << "a的地址为:" << &a << endl;
	cout << "指针p为:" << p << endl;

	// 2、使用指针
	// 可以通过 解引用 的方式来找到指针指向的内存
	// 指针前加 * 代表解引用,找到指针指向的内存中的数据
	*p = 1000;
	cout << "a = " << a << endl;
	cout << "*p = " << *p << endl;

	return 0;
}

output:

a的地址为:00EFFA1C
指针p为:00EFFA1C
a = 1000
*p = 1000
请按任意键继续. . .

指针所占的内存空间

指针也是种数据类型

指针在32位操作系统下:占4个字节空间

指针在64位操作系统下:占8个字节空间

这里都是用32位操作系统演示

int b = 20;
	int* p2 = &b;
	cout << sizeof(p2) << endl;  // cout << sizeof(int *) << endl;  // 这里效果等价
	cout << sizeof(int*) << endl;

output

4
4

空指针和野指针

空指针:指针变量指向内存中编号为0的空间

用途:初始化指针变量

注意:空指针指向的内存是不可以访问的

#include <iostream>
using namespace std;



int main() {
	//空指针
	// 1、空指针用于给指针变量进行初始化
	int* p = NULL;

	// 2、空指针是不可以进行访问
	// 0~255之间的内存编号是系统占用的,因此不可以访问
	*p = 100;
	return 0;
}

野指针:指针变量指向非法的内存空间

#include <iostream>
using namespace std;



int main() {
	// 野指针
	// 在程序中,尽量避免出现野指针
	int* p = (int *)0x1100;

	cout << *p << endl;

	return 0;
}

总结:空指针和野指针都不是我们申请的空间,因此不要访问

const修饰指针

小技巧 * 读指针 ,const 读 常量

#include <iostream>
using namespace std;



int main15() {
	// 1、const修饰指针   常量指针
	int a = 10;
	int b = 20;

	const int* p = &a;
	// 指针指向的值不可以改,指针的指向可以改
	// *p = 20;  错误
	p = &a;  // 正确


	// 2、const修饰常量   指针常量
	// 指针的指向不可以改,指针指向的值可以改
	int* const p2 = &a;
	*p2 = 100; // 正确
	// p2 = &b; // 错误的


	// 3、const修饰常量和指针
	// 指针的指向,和指针指向的值 都不可以改
	const int* const p3 = &a;
	// *p3 = 100;  // 错误
	// p3 = &b;	// 错误

	return 0;
}

1、常量指针

2、指针常量

3、const即修饰指针,又修饰常量

标签:const,常量,指向,int,C++,修饰,指针
From: https://www.cnblogs.com/code3/p/17301485.html

相关文章

  • C++-Ubuntu core dumped(核心已转储)-GDB调试
    C++-Ubuntucoredumped(核心已转储)-GDB调试Linux的可执行程序异常退出时,提示“核心已转储”。此时需要系统生成core文件,并通过GDB调试以确定问题。https://blog.csdn.net/scjdas/article/details/128585787设置系统生成core文件用ulimit-a查看corefilesize项是否......
  • C/C++模拟校园卡消费记录查询系统[2023-04-09]
    C/C++模拟校园卡消费记录查询系统[2023-04-09]模拟校园卡1问题描述同学们都在机房做实验或自由上机,请根据自己实际使用情况编写一份模拟校园卡消费记录查询系统,实现登录,计费,挂失,统计等相关功能。2功能要求主要功能模块:(1)登录模块:同学根据自己设定的密码登录。三次错误则......
  • 斯坦福 UE4 C++ ActionRoguelike游戏实例教程 08.创建主HUD & 自定义作弊指令
    斯坦福课程UE4C++ActionRoguelike游戏实例教程0.绪论概述本篇文章对应课程Lecture14,56-58节。本篇文章将会教你将之前创建的各种UMG控件统合到一个主控件上。此外,还会教你如何在C++中创建自定义作弊指令,并在游戏中使用控制台执行它。目录创建主HUD使用GameMode生成玩......
  • 斯坦福 UE4 C++ ActionRoguelike游戏实例教程 09.第二个游戏规则:玩家重生
    斯坦福课程UE4C++ActionRoguelike游戏实例教程0.绪论概述本文对应课程15章,60-RefiningPlayerRespawns。在本篇文章中,将会为游戏新增加一个规则,即玩家可以自动产卵,呸,自动重生。设定玩家重生在之前的课程中,我们使用GameMode为游戏添加了第一个规则,即自动生成AI小兵。在......
  • Python同Java及C++的不同之处
    Python同Java及C++的不同之处1.C++、Java对变量的定义很严格比如inta=0python则直接定义a=02.C++、Java代码结束时需要用;隔开比如inta=0;,而python则不用a=0直接换行即可3.C++、Java中的循环或者判断需要用{}括起来for(i=0;i<5;i++){},python使用:forii......
  • C-指针数组与数组指针
    指针数组用于存放指针的数组inta=1,b=2,c=3;int*arr[3]={&a,&b,&c};//arr[0]==&a//*arr[0]==aint**p=arr;//*p==arr[0]==&a//p[0]==arr[0]==&a//*(p+1)==arr[1]==&b//**p==*arr[0]==a//*p[0]==*ar......
  • 2023第14届蓝桥杯C/C++A组参赛记录+部分题解
    比赛记录早上起得还算早,没吃早餐,我吃早餐会瞌睡,也会变蠢。在门口还没来得及和队里其他同学聊几句就进场了......键盘还是一样的难用,软件有codeblocks和dev,很舒服。今年来参加蓝桥杯的人好多啊......女生也好多。听说今年蓝桥杯有统一的正经培训,不过和我这个被踢出蓝桥杯群的......
  • c++ constexpr
    c++中,constexpr 让用户显式的声明函数或对象构造函数在编译期会成为常量表达式,这个关键字明确的告诉编译器应该去验证被声明的表达式在编译期就应该是一个常量表达式。声明为constexpr的变量一定是一个const变量,而且必须用常量表达式初始化:constexprintmf=20;//20是常量......
  • 字符数组指针巩固学习
    1、字符数组的数组名存的就是字符数组的起始地址,类型是字符指针2、str系列字符串函数主要包括strlen,strcpy,strcmp,strcatstrlen:用于统计字符串长度strcpy:用于将某个字符串复制到字符数组中strcmp:用于比较两个字符串的大小,比较对应字符的ASCII码值strcat:用于将两个字符......
  • C++构造函数的调用
    对象特性---构造函数和析构函数构造函数---没有回值也不写void---函数值和类名相同---构造函数可以有参数,因此可以发生重载---程序在调用对象的时候自动调用构造,无须手动调用,只能调用一次析构函数语法---析构函数,没有返回值也不写void---函数名和类名也相同,在名称前加上符号~---......