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

C++ 指针

时间:2024-09-12 13:56:27浏览次数:15  
标签:初始化 指向 对象 void C++ int 指针

声明

int *ipl,*ip2;  // ipl和 ip2 都是指向 int 型对象的指针
double dp,*dp2; // dp2是指向 double型对象的指针,dp是double 型对象

因为引用不是对象,没有实际地址,所以不能定义指向引用的指针。

指针值

指针的值(即地址)应属下列4种状态之一:

  1. 指向一个对象。
  2. 指向紧邻对象所占空间的下一个位置。
  3. 空指针,意味着指针没有指向任何对象。
  4. 无效指针,也就是上述情况之外的其他值。

试图拷贝或以其他方式访问无效指针的值都将引发错误。编译器并不负责检查此类错误,这一点和试图使用未经初始化的变量是一样的。访问无效指针的后果无法预计,因此程序员必须清楚任意给定的指针是否有效。

尽管第2种和第3种形式的指针是有效的,但其使用同样受到限制。显然这些指针没有指向任何具体对象,所以试图访问此类指针(假定的)对象的行为不被允许。如果这样做了,后果也无法预计。

空指针

一下都是空指针。

int *pl = nullptr; //等价于int *pl =0;
int *p2 = 0;  //直接将 p2初始化为字面常量 0
//需要首先#include cstdlib
int *p3=NULL; //等价于int *p3 =0;

建议初始化所有的指针,并且在可能的情况下,尽量等定义了对象之后再定义指向它的指针。如果实在不清楚指针应该指向何处,就把它初始化为 nullptr 或者 0, 这样程序就能检测并知道它没有指向任何具体的对象了。

指针操作

如果指针的值是0(nulptr),条件取false。任何非0(nulptr)指针对应的条件值都是 true。

指针相等(==)的情况,两个指针存放的地址值相同(两个指针相等)有三种可能:

  1. 它们都为空
  2. 都指向同一个对象
  3. 或者都指向了同一个对象的下一地址。

需要注意的是,一个指针指向某对象,同时另一个指针指向另外对象的下一地址,此时也有可能出现这两个指针值相同的情况,即指针相等。 // 另外一个指针的下一个对象,刚好指向同一个对象。

void *

void*指针能做的事儿比较有限:**拿它和别的指针比较、作为函数的输入或输出,或者赋给另外一个 void* 指针 **。

不能直接操作 void* 指针所指的对象,因为我们并不知道这个对象到底是什么类型,也就无法确定能在这个对象上做哪些操作。




《C++ Primer》 P50

标签:初始化,指向,对象,void,C++,int,指针
From: https://www.cnblogs.com/huvjie/p/18409984

相关文章

  • C++ 声明和定义
    变量声明规定了变量的类型和名字,在这一点上定义与之相同。但是除此之外,定义还申请存储空间,也可能会为变量赋一个初始值。如果想声明一个变量而非定义它,就在变量名前添加关键字extern,而且不要显式地初始化变量:externinti;//声明i而非定义iintj;//声明并定义了任何包......
  • C++ 变量初始化
    列表初始化当用于内置类型的变量时,这种初始化形式有一个重要特点:如果我们使用列表初始化且初始值存在丢失信息的风险,则编译器将报错:longdoubleld=3.1415926536;inta{ld},b={ld};//错误:转换未执行,因为存在丢失信息的危险intc(ld),d=ld;//正确:转换执行,且确实丢失了......
  • C++复习day11
    类型转化C语言中的类型转换在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化,C语言中总共有两种形式的类型转换:隐式类型转换和显式类型转换。隐式类型转化:编译器在编译阶段自动进行,能转就转,......
  • C++竞赛初阶L1-15-第六单元-多维数组(34~35课)556: T456506 矩阵转置
    题目内容输入一个 n 行 m 列的矩阵 A,输出它的转置 AT。输入格式第一行包含两个整数 n 和 m,表示矩阵 A 的行数和列数。1≤n≤100,1≤m≤100。接下来 n 行,每行 m 个整数,表示矩阵 A 的元素。相邻两个整数之间用单个空格隔开,每个元素均在 1∼1000 之间。输......
  • C++竞赛初阶L1-15-第六单元-多维数组(34~35课)557: T456507 图像旋转
    题目内容输入一个 n 行 m 列的黑白图像,将它顺时针旋转 90 度后输出。输入格式第一行包含两个整数 n 和 m,表示图像包含像素点的行数和列数。1≤n≤100,1≤m≤100。接下来 n 行,每行 m 个整数,表示图像的每个像素点灰度。相邻两个整数之间用单个空格隔开,每个元素......
  • C++竞赛初阶L1-15-第六单元-多维数组(34~35课)555: T456505 矩阵乘法
    题目内容计算两个矩阵的乘法。n×m 阶的矩阵 A 乘以 m×k 阶的矩阵 B 得到的矩阵 C 是 n×k 阶的,且 C[i][j]=A[i][0]×B[0][j]+A[i][1]×B[1][j]+ …… +A[i][m−1]×B[m−1][j](C[i][j] 表示 C 矩阵中第 i 行第 j 列元素)。输入格式第一行为 n,m,k,表......
  • C++竞赛初阶L1-15-第六单元-多维数组(34~35课)554: T456504 矩阵加法
    题目内容输入两个 n 行 m 列的矩阵 A 和 B,输出它们的和 A+B,矩阵加法的规则是两个矩阵中对应位置的值进行加和,具体参照样例。输入格式第一行包含两个整数 n 和 m,表示矩阵的行数和列数 (1≤n≤100,1≤m≤100)。接下来 n 行,每行 m 个整数,表示矩阵 A 的元素......
  • c++求助bfs流星雨题目为什么代码编不过
    题目链接3669--MeteorShower(poj.org)英文题目DescriptionBessiehearsthatanextraordinarymeteorshoweriscoming;reportssaythatthesemeteorswillcrashintoearthanddestroyanythingtheyhit.Anxiousforhersafety,shevowstofindherwayt......
  • c++primer第四章复合类型学习笔记
    数组数组创建声明:存储元素类型数组名数组的元素个数#include<iostream>usingnamespacestd;intmain(){intyams[3];yams[0]=7;yams[1]=8;yams[2]=6;intyamcosts[3]={20,30,5};cout<<"Totalyams=";cout<<......
  • c++primer第五章循环和关系表达式学习笔记
    for循环简单for循环#include<iostream>usingnamespacestd;intmain(){//5.1inti;for(i=0;i<5;i++)cout<<"C++knowsloops.\n";cout<<"C++knowswhentostop.\n";return0;}for循环组成部分#......