首页 > 编程语言 >c++指针相关

c++指针相关

时间:2023-10-21 20:38:39浏览次数:30  
标签:pp p1 const int c++ Valid 相关 指针

常量指针 (Pointer to Constant)

定义:一个指向常量的指针。这意味着指针指向的值不能被修改,但指针本身可以被修改,即可以重新指向其他地址。

声明:const Type* pointerName;

const int* p1;
int x = 10, y = 20;
p1 = &x;   // Valid
*p1 = 50;  // Error
p1 = &y;   // Valid

指针常量 (Constant Pointer)

定义:一个常量指针,它的地址是固定的,不能被修改。但是,通过这个指针,你可以修改它所指向的值。

声明:Type* const pointerName;

int* const p2 = &x;
*p2 = 50;  // Valid
p2 = &y;  // Error

多级指针

先看一段最基础的代码:

int x = 10;
int* p = &x;
int** pp = &p;

解读多级指针应该从右往左看,先看到的是 *pp,代表 pp 是一个指针,然后再看到int*,代表 pp 指向的是一个 int* 型的指针

假设我们在多级指针中添加 const:

  • case1
int x = 10, y = 20;
int* p = &x;
int* p1 = &y;
int* *const pp = &p;

我们从右往左分析:先看到的是一个*const,代表pp是一个指针常量,然后看到的是int*,代表pp指向的是一个int*型的指针

有如下测试程序:

int x = 10, y = 20;
int* p = &x;
int* p1 = &y;
int* *const pp = &p;
int* *const pp1 = &p1;

**pp = 100;  // Valid

*pp = p1;  // Valid
pp = pp1;  // Error
  • case2
int x = 10, y = 20;
int* p = &x;
int* p1 = &y;
int* const* pp = &p;

我们从右往左分析:先看到的是一个 const*,代表 pp 是一个常量指针,然后看到 int*,代表pp指向的是一个int*型的指针

有如下测试程序:

int x = 10, y = 20;
int* p = &x;
int* p1 = &y;
int* const* pp = &p;
int* const* pp1 = &p1;

**pp = 30;  // Valid

pp = pp1;  // Valid
*pp = p1;  // Error
  • case3
int x = 10, y = 20;
int* p = &x;
int* p1 = &y;
int const* *pp = &p;

我们从右往左分析:先看到的是一个 *pp,代表 pp 是一个指针,然后看到 const*,代表pp指向的是一个常量指针

有如下测试程序:

int x = 10, y = 20;
int* p = &x;
int* p1 = &y;
int const* *pp = &p;
int const* *pp1 = &p1;
pp = pp1;  // Valid
*pp = p1;  // Valid
**pp = 30;  // Error
  • case4
int* ap[2];

解读这种声明时,通常的方法是从变量名开始,然后向外扩展,同时考虑操作符的优先级。在这种情况下,方括号 [](表示数组)的优先级高于星号 *(表示指针)

核心部分:ap 是我们正在声明的变量的名称。
数组大小:[2] 表示 ap 是一个数组,它有两个元素。
元素类型:int* 表示数组的每个元素都是指向整数的指针。

因此,整体来看,int* ap[2] 可以被解读为:ap 是一个数组,包含两个指向整数的指针”。

数组指针

一般格式:
ElementType (*PointerName)[ArraySize];

  • case1
int arr1[3] = {1, 2, 3};
int (*ptr1)[3] = &arr1;
std::cout << "(*ptr1)[1]: " << (*ptr1)[1] << std::endl;  // Should print 2
  • case2
void printArray(int (*arr)[3], int size) {
    for (int i = 0; i < size; ++i) {
        std::cout << (*arr)[i] << " ";
    }
    std::cout << std::endl;
}
printArray(ptr1, 3);  // Should print 1 2 3
  • case3
int arr2[2][3] = {{1, 2, 3}, {4, 5, 6}};
int (*ptr2)[2][3] = &arr2;
std::cout << "(*ptr2)[1][2]: " << (*ptr2)[1][2] << std::endl;  // Should print 6

标签:pp,p1,const,int,c++,Valid,相关,指针
From: https://www.cnblogs.com/hacker-dvd/p/17779408.html

相关文章

  • c++默认实参
    参考:默认实参#include<iostream>voidf(inta,intb=1);//只要前面声明了b的值,后面b可以不给默认值voidf(inta=2,intb){std::cout<<a<<''<<b<<'\n';}intmain(){f();}......
  • C++ 使用EPSG进行坐标转换
    场景将WGS84坐标转换为CGCS2000坐标使用epsg.io网站的坐标系转换功能可以检查转换结果是否正确下面网址是示例代码https://epsg.io/transform#s_srs=4326&t_srs=4538&x=88.0000000&y=47.0000000转换示例代码projver.9.2.0安装proj库,使用vcpkg(vcpkginstallproj:x64-wind......
  • VSCode配置Clang C/C++开发环境 [+clangd代码静态检查配置]
    问题:gcc/g++是c/c++使用最广泛的编译器,也是linux默认自带的编译套件,但在vscode上,也可通过微软官方提供的C/C++插件很便捷进行c/c++代码编译调试,但是该插件的自动补全和代码提示等功能很差,经常给不出合理的候选项。另外一套C/C++代码编译套件是基于LLVM的clang/clang++编译器、ll......
  • Leetcode原题 -- 螺旋矩阵相关
    第一题:54. 螺旋矩阵题目描述:给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。示例:输入:matrix=[[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]解题思路:按层遍历,如图所示,找到规律后就差不多了publicList<Integer>spiral......
  • 手撕Vue-实现事件相关指令
    经过上一篇文章的学习,实现了界面驱动数据更新,接下来实现一下其它相关的指令,比如事件相关的指令,v-on这个指令的使用频率还是很高的,所以我们先来实现这个指令。v-on的作用是什么,是不是可以给某一个元素绑定一个事件。紧接着了解了v-on的作用之后,我在example.html的结构代码......
  • 8.1 C++ 标准输入输出流
    C/C++语言是一种通用的编程语言,具有高效、灵活和可移植等特点。C语言主要用于系统编程,如操作系统、编译器、数据库等;C语言是C语言的扩展,增加了面向对象编程的特性,适用于大型软件系统、图形用户界面、嵌入式系统等。C/C++语言具有很高的效率和控制能力,但也需要开发人员自行管理内存......
  • 8.2 C++ 引用与取别名
    C/C++语言是一种通用的编程语言,具有高效、灵活和可移植等特点。C语言主要用于系统编程,如操作系统、编译器、数据库等;C语言是C语言的扩展,增加了面向对象编程的特性,适用于大型软件系统、图形用户界面、嵌入式系统等。C/C++语言具有很高的效率和控制能力,但也需要开发人员自行管理内存......
  • 8.3 C++ 定义并使用类
    C/C++语言是一种通用的编程语言,具有高效、灵活和可移植等特点。C语言主要用于系统编程,如操作系统、编译器、数据库等;C语言是C语言的扩展,增加了面向对象编程的特性,适用于大型软件系统、图形用户界面、嵌入式系统等。C/C++语言具有很高的效率和控制能力,但也需要开发人员自行管理内存......
  • 8.4 C++ 运算符重载
    C/C++语言是一种通用的编程语言,具有高效、灵活和可移植等特点。C语言主要用于系统编程,如操作系统、编译器、数据库等;C语言是C语言的扩展,增加了面向对象编程的特性,适用于大型软件系统、图形用户界面、嵌入式系统等。C/C++语言具有很高的效率和控制能力,但也需要开发人员自行管理内存......
  • 8.5 C++ 继承与多态
    C/C++语言是一种通用的编程语言,具有高效、灵活和可移植等特点。C语言主要用于系统编程,如操作系统、编译器、数据库等;C语言是C语言的扩展,增加了面向对象编程的特性,适用于大型软件系统、图形用户界面、嵌入式系统等。C/C++语言具有很高的效率和控制能力,但也需要开发人员自行管理内存......