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循环使用

目录
相关文章
|
8天前
|
存储 程序员 C++
深入解析C++中的函数指针与`typedef`的妙用
本文深入解析了C++中的函数指针及其与`typedef`的结合使用。通过图示和代码示例,详细介绍了函数指针的基本概念、声明和使用方法,并展示了如何利用`typedef`简化复杂的函数指针声明,提升代码的可读性和可维护性。
35 0
|
1月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
100 4
|
2月前
|
存储 安全 编译器
在 C++中,引用和指针的区别
在C++中,引用和指针都是用于间接访问对象的工具,但它们有显著区别。引用是对象的别名,必须在定义时初始化且不可重新绑定;指针是一个变量,可以指向不同对象,也可为空。引用更安全,指针更灵活。
|
2月前
|
存储 C++
c++的指针完整教程
本文提供了一个全面的C++指针教程,包括指针的声明与初始化、访问指针指向的值、指针运算、指针与函数的关系、动态内存分配,以及不同类型指针(如一级指针、二级指针、整型指针、字符指针、数组指针、函数指针、成员指针、void指针)的介绍,还提到了不同位数机器上指针大小的差异。
63 1
|
2月前
|
存储 编译器 C语言
C++入门2——类与对象1(类的定义和this指针)
C++入门2——类与对象1(类的定义和this指针)
49 2
|
2月前
|
存储 安全 编译器
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(一)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
|
2月前
|
存储 C++ 索引
C++函数指针详解
【10月更文挑战第3天】本文介绍了C++中的函数指针概念、定义与应用。函数指针是一种指向函数的特殊指针,其类型取决于函数的返回值与参数类型。定义函数指针需指定返回类型和参数列表,如 `int (*funcPtr)(int, int);`。通过赋值函数名给指针,即可调用该函数,支持两种调用格式:`(*funcPtr)(参数)` 和 `funcPtr(参数)`。函数指针还可作为参数传递给其他函数,增强程序灵活性。此外,也可创建函数指针数组,存储多个函数指针。
|
3月前
|
编译器 C++
【C++核心】指针和引用案例详解
这篇文章详细讲解了C++中指针和引用的概念、使用场景和操作技巧,包括指针的定义、指针与数组、指针与函数的关系,以及引用的基本使用、注意事项和作为函数参数和返回值的用法。
57 3
|
2月前
|
存储 编译器 程序员
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(二)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
|
3月前
|
C++
C++(十八)Smart Pointer 智能指针简介
智能指针是C++中用于管理动态分配内存的一种机制,通过自动释放不再使用的内存来防止内存泄漏。`auto_ptr`是早期的一种实现,但已被`shared_ptr`和`weak_ptr`取代。这些智能指针基于RAII(Resource Acquisition Is Initialization)原则,即资源获取即初始化。RAII确保对象在其生命周期结束时自动释放资源。通过重载`*`和`-&gt;`运算符,可以方便地访问和操作智能指针所指向的对象。