c++学习笔记06 指针

简介: C++指针的详细学习笔记06,涵盖了指针的定义、使用、内存占用、空指针和野指针的概念,以及指针与数组、函数的关系和使用技巧。
定义指针

数据类型* 指针变量名
int* p是定义名为p的指针变量
注意*是和int在一起的
*和p在一起时代表解引用
取地址:&a是取变量a的地址

int a = 10;
int* p;
p = &a;//指针变量p用于记录变量a的地址
cout << "a的地址是:" << &a<<endl;
cout << "指针p为:" << p << endl;
使用指针

解引用找到指针指向的内存的内容
指针前加*代表解引用,找到指针指向的内存中的存储的数据

*p = 1000;//为 指针p所指向地址的内存代表的变量 赋值
cout << "a= " << a << endl;
cout << "*p= " << *p << endl;
指针所占的内存空间大小

x86是32位系统
x64是64位系统
在32位系统下指针所占字节为4,不管是什么数据类型
64位下所占字节为8
指针变量用来存放地址

空指针(指针初始化)

指向内存中编号为0的空间
用于:初始化指针变量(不知道某个指针该指向哪个地址,先初始化让他指0了)
空指针指向的地址不可访问 0~255之间的内存编号是系统占用的 不可访问
错误示例如下:

int* q = NULL;
cout << *q << endl;

将会引发
在这里插入图片描述
同样的

野指针

指向非法的内存空间
非自己定义的内存空间,乱指的话可能没有访问权限

int* q = (int*)0x1100;
cout << *q;
const对指针的修饰

常量指针
指向常量的指针
指针的指向可以修改,指针指向的内存的值不可以通过指针来修改
但是可以对指向的地址进行修改
比如

c=100
int c = 10;
int d = 20;
const int* ptr = &c;
cout << "修改前: " << *ptr << " 此时指向的地址是:" << ptr << endl;

//错误用法:试图修改指针指向的常量值
//*ptr = 20;
//正确用法:
ptr = &d;
cout <<"修改后: "<< * ptr << " 此时指向的地址是:" << ptr << endl;

指针常量
这个指针变量本身是一个常量
指针的指向不可以修改,但是它所指的内存的值可以修改

int* const ptr2 = &c;
//错误用法:试图修改指针的方向
//ptr2=&d;
//正确用法:
cout << "修改前变量c的值是:" << c<<endl;
*ptr2 = 666;
cout << "修改后变量c的值是:" << c<<endl;

指针和指针所指向的值都是常量

const int* const ptr3 = &c;
//错误用法:
//*ptr3 = d;
//ptr3 = &d;
指针与数组
int array[10] = {
   
    1,2,3,4,5,6,7,8,9,10 };
cout << "第一个元素为:" << array[0] << endl;
int* p = array;//array是数组的首地址
cout << "利用指针指向首地址输出第一个元素: " << *p << endl;
p++;//或写作p = p + 1; 此处不是偏移一个字节而是偏移四个字节,因为每个指针在32位系统中占据4个字节
cout << "利用指针指向首地址输出第2个元素: " << *p << endl;
//遍历一遍数组
p = array;//重新将指针指向数组首地址
for (int i = 0; i < 10; i++)
{
   
   
    cout << *p<<endl;
    p++;
}
指针与函数

区分函数的值传递和地址传递
值传递只能改变形参
函数还可以使用地址传递来改变主程序中的实参
地址传递可以通过地址 间接 改变实参值

void swap(int* p1, int* p2)
{
   
   
    int temp = *p1;
    *p1 = *p2;
    *p2 = temp;
}
//主程序
int a=10,b=20;
cout << "地址swap前的a和b: "<< a <<" "<< b<<endl;
swap(&a, &b);
cout <<"地址swap后的a和b: "<< a << " " << b << endl;

修改后的示意图:
在这里插入图片描述

小知识:
当数组要传入函数时,除了传入首地址,常常还传入一个长度,这个len=sizeof(a) / sizeof(a[0]),方便函数的for循环使用

目录
相关文章
|
2月前
|
C++
c++学习笔记07 结构体
C++结构体的详细学习笔记07,涵盖了结构体的定义、使用、数组、指针、嵌套、与函数的交互以及在结构体中使用const的示例和解释。
34 0
|
5天前
|
存储 C++ 索引
C++函数指针详解
【10月更文挑战第3天】本文介绍了C++中的函数指针概念、定义与应用。函数指针是一种指向函数的特殊指针,其类型取决于函数的返回值与参数类型。定义函数指针需指定返回类型和参数列表,如 `int (*funcPtr)(int, int);`。通过赋值函数名给指针,即可调用该函数,支持两种调用格式:`(*funcPtr)(参数)` 和 `funcPtr(参数)`。函数指针还可作为参数传递给其他函数,增强程序灵活性。此外,也可创建函数指针数组,存储多个函数指针。
|
13天前
|
编译器 C++
【C++核心】指针和引用案例详解
这篇文章详细讲解了C++中指针和引用的概念、使用场景和操作技巧,包括指针的定义、指针与数组、指针与函数的关系,以及引用的基本使用、注意事项和作为函数参数和返回值的用法。
14 3
|
11天前
|
存储 Go
Go: struct 结构体类型和指针【学习笔记记录】
本文是Go语言中struct结构体类型和指针的学习笔记,包括结构体的定义、成员访问、使用匿名字段,以及指针变量的声明使用、指针数组定义使用和函数传参修改值的方法。
|
1月前
|
C++
C++(十八)Smart Pointer 智能指针简介
智能指针是C++中用于管理动态分配内存的一种机制,通过自动释放不再使用的内存来防止内存泄漏。`auto_ptr`是早期的一种实现,但已被`shared_ptr`和`weak_ptr`取代。这些智能指针基于RAII(Resource Acquisition Is Initialization)原则,即资源获取即初始化。RAII确保对象在其生命周期结束时自动释放资源。通过重载`*`和`-&gt;`运算符,可以方便地访问和操作智能指针所指向的对象。
|
1月前
|
C++
C++(九)this指针
`this`指针是系统在创建对象时默认生成的,用于指向当前对象,便于使用。其特性包括:指向当前对象,适用于所有成员函数但不适用于初始化列表;作为隐含参数传递,不影响对象大小;类型为`ClassName* const`,指向不可变。`this`的作用在于避免参数与成员变量重名,并支持多重串联调用。例如,在`Stu`类中,通过`this-&gt;name`和`this-&gt;age`明确区分局部变量与成员变量,同时支持链式调用如`s.growUp().growUp()`。
|
1月前
|
安全 C语言 C++
C++学习笔记
C++学习笔记
|
2月前
|
存储 安全 C++
C++:指针引用普通变量适用场景
指针和引用都是C++提供的强大工具,它们在不同的场景下发挥着不可或缺的作用。了解两者的特点及适用场景,可以帮助开发者编写出更加高效、可读性更强的代码。在实际开发中,合理选择使用指针或引用是提高编程技巧的关键。
25 1
|
2月前
|
C++
【学习笔记】【C/C++】 c++字面值常量
【学习笔记】【C/C++】 c++字面值常量
29 1
|
2月前
|
编译器 C++
【C/C++学习笔记】C++声明与定义以及头文件与源文件的用途
【C/C++学习笔记】C++声明与定义以及头文件与源文件的用途
34 0