首页 > 其他分享 >指针(待续……)

指针(待续……)

时间:2022-11-11 20:01:19浏览次数:47  
标签:待续 变量 指向 int 可以 new 指针

int *p;定义了指针变量p,这个变量储存了一个地址,这个地址对应的变量是int类型的。&是取地址符,int *p = &x;就定义了一个指向x的指针。指向相同类型变量的指针之间可以相互赋值(不同类的不行,指向的地址长度可能不同)。在程序中,可以把*p看作x,例如*p = y+1;表示把y+1赋值给x

const int *p;表示p指向一个const int,因此*p不能修改,但p可以修改;int *const p = &x;(定义时就要给出初值)表示p只能指向x*p可以修改,但p不能修改。如果是const int *const p = &x;就都不能修改。

对于暂时没有使用的指针应当赋为nullptr(这是C++11的新用法,它避免了NULL隐式转换为整型0的问题,它不能被隐式转换为整型)

指针可以进行加减运算,它基于指向的变量类型的字节数。假如p指向整型,那么p+1实际上对应着地址+4。

C++的数组名是一个指针常量。a[i]本质上就是*(a+i)。如果执行p=i,那么也可以用p[i]来访问*(p+i)。定义数组与定义指针变量仅仅在内存分配上产生差别。

可以用指针申请动态内存空间。对于指针变量int *p,执行p = new int;。申请到的内存空间属于“堆”,我们操作得到这片内存的首地址。在申请的时候可以顺便赋初值,p = new int(10);。也可以申请一个动态变量数组p = new int [10];(可以访问p[0]p[9])。可以顺便赋初值p = new int[5]{1,2,3,4,5};。数组的长度可以是变量而不一定要是常量。

动态内存空间必须手动回收。回收单个动态变量,执行delete p;。(p是指向它的指针变量)。回收数组,执行delete [] p;。回收之后,指针变量依然指向那片空间,但是无法访问。

堆空间有限,在new之前最好先确认申请成功。先写p = new int;。如果申请失败,p的值会被赋为nullptr

对于一个指向字符的指针变量s,可以执行s="abcde",右侧是一个字符串常量,它在内存中与静态变量储存在一起。可以访问s[3],但是不能修改s[3]

C++函数参数只是被参数值初始化了的局部变量。然而,如果参数是指针,那么操作指针就可以改变变量的值了。因此,也可以把指针参数传入函数专门用来储存答案,这样一个函数就可以“有多个返回值”。函数中的数组参数void f(int a[])实际上只是一个指针,等价于void f(int *a),在初始化的时候将对应的指针赋给了a而已。函数的返回值也可以是一个指针,比如char *f(int a)

引用是变量的别名,定义时必须赋值int &j = i,之后在代码中j就表示i。本质上引用是一个隐式的指针,可以让我们不用写*。但引用变量的绑定是永久的,不能再执行j = &c。 引用类型可以引用引用类型,例如int &k = j,那么k,j,i就都是同一个东西。也可以引用常量const int &a = 1,实质是系统生成一个值为1的临时变量(不能修改)并让a作为这个变量的别名(一个隐式指针),也可以执行const int &a = b,那么a就不能被重新赋值,但普通变量b可以被赋值。

C++引入“引用”的目的主要是作为函数的参数。在swap中定义void swap(int &a, int &b),那么调用swap(x,y)相当于给局部变量赋了初值int &a = x, &b = y,那么a,b就作为隐式指针指向了x,y,因此a,b就称为实参了。这和void swap(int *a, int *b)swap(&x, &y)是等价的,但是写起来更方便。

函数的返回值可以是引用,这相当于返回了一个变量,可以作为左值。假如有函数int &index(int j){ return a[j]; }那么就可以调用index(2) = 25。返回的引用变量不能是局部变量或者表达式,因为必须确保在调用时这个变量仍然存在。

可以定义由指针变量组成的“指针数组”,char *s[20]可以用来表示一组字符串。而由于数组名本身是一个指针,所以s本身是一个指向指针变量的指针(多级指针)。int x=15, *p = &x, **q = &p;q就是一个二级指针。

C++不能申请动态的二维数组。然而,可以先申请动态的指针数组int **a; a = new int *[3]; ... a[i] = new int [3]。回收时执行delete [] a[i]; delete [] a;

指针可以指向一个函数,double (*p)(int, int);定义了一个指向函数的指针,这个函数有两个int参数,返回类型是double(*p)的括号不能省略,不然就被当作函数原型了。

标签:待续,变量,指向,int,可以,new,指针
From: https://www.cnblogs.com/qixingzhi/p/16881595.html

相关文章

  • 【转】内存的堆分配和栈分配 & 字符数组,字符指针,Sizeof总结
    堆和栈的区别一个由C/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈......
  • Android错误之setAdapter(adapter)空指针nullPointer 解决办法
    在设置adapter时,会经常遇到如下错误:空指针错误如果setAdapter报空指针,那么可用如下语句调试,找出到底哪里产生空指针hisList=(ListView)findViewById(R.id.oillist);......
  • C语言 指针及动态内存分配
    大一学《计算系统基础》的时候,没有讲这一块的内容,导致后面遇到指针就头疼,今天特来梳理一下这块的内容。1.变量的类型类型的语言,即要求定义变量的时候必须制定类型,然后编译器......
  • VS2019 error C4703: 使用了可能未初始化的本地指针变量 错误
    目录​​一、异常错误​​​​二、原因​​​​三、解决方法​​​​1.关闭安全开发生命周期(SDL)检查​​​​2.或者将指针变量初始化为nullptr​​一、异常错误errorC470......
  • 818E - Card Game Again 双指针+分解质因数
    题意:有多少种xy的选择方法,使得对于长度为n的a数组,取 a[x+1],a[x+2]...a[y-2],a[y-1]的乘积是k的倍数 思路:对于所有的x,当选择x=x+1时y=y......
  • 初识指针
    指针intmain(){ inta=10;//a在内存中要分配空间的—4个字节 printf("%p\n",&a);//%p专门用来打印地址的 int*pa=&a;//pa是用来存放地址的,在C语言中pa叫指针......
  • C语言函数指针示例
      1#include<stdio.h>23doubleadd(doublea,doubleb)4{5returna+b;6}78doublesub(doublea,doubleb)9{10returna-......
  • iOS:Weak指针的原理
    *Runtime维护了一张weak表,用来存放对象的weak指针*weak表是一张哈希表,对象的指针为key,value为指向该对象的weak指针数组。*当对象被释放前,会查询weak表中的所有wea......
  • 09-Go语言的指针和结构体
    指针的声明funcmain(){ a:=10 varp1*int p1=&a //指针保存的地址 fmt.Println(p1) //指针本身的地址 fmt.Println(&p1) //指针指向保存的数据 fmt.Print......
  • 指针(译)
    『就要学习Go语言』系列--第28 篇分享好文当我们调用一个带有参数的函数是,参数是原值的拷贝:funczero(xint){x=0}funcmain(){x:=5zero(x)fmt.Printl......