C++指针相关问题

C++指针相关问题

一、总结

一句话总结:

a、数组名是这个数组的首地址:a[3][4]:a int(*)[4]、&a int(*)[3][4]、a[0] int*、a[0][0] int
b、int ** 表示指向指针的指针:int m = 1; int *p = &m; int ** a = &p;
c、数组指针和指针数组:指针数组:int*[]:int* a[3]:array of pointers,数组指针:int(*)[]:int (*a)[3]:a pointer to an array

1、数组名对应的指针?

a、定义一个一维数组,数组名是这个数组的首地址
b、int a[5]; a指向 a[0];a[0]是int的元素,a的类型就是int*

2、a和&a的值(地址)是一样的,但是类型不一样?

*、a 这个地址指向a[0]int元素,所以a+1偏移4
*、&a 这个地址指向整个数组,&a的类型是int(*)[5],所以&a+1偏移20

3、用指针来接收一个数组int a[5]={1,2,3,4,5};?

因为a是a[0]的地址,为int *类型,所以可以用一个int *类型的变量来接收它,int *p=a;


int a[5]={1,2,3,4,5};
因为a是int *类型
所以可以用一个int *类型的变量来接收它
int *p=a;
这里的p就是指向的是a[0]的首地址

*p是a[0]的值
*(p+1)是a[1]的值

4、int a[5]={1,2,3,4,5}; int *p=a; *(p+i)和*p++的区别是什么?

*(p+i),都是依次访问地址对应的元素,这里p地址不变
*p++,都是依次访问地址对应的元素,这里p地址改变


所以也可以用*p++,两个都是单目运算符,从右往左

5、多维数组在内存里面的存储方式?

二维数组,比如a[3][4]虽然有3行4列,但是在内存里面还是是一段连续的地址


a是二维数组的首地址,a指向二维数组第一个存储单元:
a是指向a[0]这个一维数组,a的类型是 是int(*)[4]
a+1 加的是16个字节

a[0]是什么,是一维数组的数组名
a[0]指向a[0][0],a[0]的类型是int *
所以a[0]+1 是加的4个字节


a int(*)[4]
&a int(*)[3][4]
a[0] int*
a[0][0] int

6、二维数组,比如a[3][4],a、&a、a[0]、a[0][0]对应的类型分别是什么?

a int(*)[4]
&a int(*)[3][4]
a[0] int*
a[0][0] int

7、多维表的指针情况?

1、&a   int(*)[][][][]
2、a    int(*)[][][]
3、a[][][]  int*
4、a[][][][]  int


&a   int(*)[][][][]
a    int(*)[][][]
a[]   int(*)[][]
a[][]  int(*)[]
a[][][] int*
a[][][][] int

8、指针数组和数组指针分别是什么?

指针数组:int*[]:int* a[3]:array of pointers,即用于存储指针的数组,也就是数组元素都是指针
数组指针:int(*)[]:int (*a)[3]:a pointer to an array,即指向数组的指针

9、如何理解int (*a)[4]是数组指针,也就是指向数组的指针,也就是指向a数组的指针?

(*a)表示一个整体,*号本来就是声明变量为指针的符号,那说明a就是一个指针,并且是执行a[5]数组的指针

10、如何理解int* a[4]是指针数组,也就是数组a中的元素都为int型指针?

这里int*是一个整体,说明是int指针类型,后面的a[4]也就表示数组里面就是存的int *的东西

11、数组指针和指针数组使用实例?

int *a[4];int c[4]={1,2,3,4}; a[1]=&c[1];//指针数组
int (*b)[4];int c[4]={1,2,3,4}; b=&c; //数组指针
#include <iostream>
using namespace std;
int main()
{
    int c[4]={1,2,3,4};
    int *a[4]; //指针数组
    int (*b)[4]; //数组指针
    b=&c;
    //将数组c中元素赋给数组a
    for(int i=0;i<4;i++)
    {
    a[i]=&c[i];
    }
    //输出看下结果
    cout<<*a[1]<<endl; //输出2就对
    cout<<(*b)[2]<<endl; //输出3就对
    return 0;
}

12、c/c++中,int ** a;是什么意思啊?

指向int指针的指针:int m = 1; int *p = &m; int ** a = &p;


在定义一个变bai量的时候,*表示指针
比如duint * a,表示a是一个指向int的指针
int **a相当于(int *) * a,表示a是一个指向int *的指针(通俗dao点说就是a的值是一个指针,或者说地址),即指向int指针的指针,这是2级指针。
int m = 1;
int *p = &m;
int ** a = &p;

int**是指向指针的指针,和数组与指针的关系不是一回事

13、c++new关键字创建数组?

new其实就是告诉计算机开辟一段新的空间,但是和一般的声明不同的是,new开辟的空间在堆上,而一般声明的变量存放在栈上。

14、c++ new关键字和一般声明变量的区别是什么?

new开辟的空间在堆上,而一般声明的变量存放在栈上。

15、c++ new出来的东西应该赋值给什么类型的变量?

new出来的是一段空间的首地址。所以一般需要用指针来存放这段地址。

16、c++ new关键字实例?

int *p = new int(3);//int 3
int *p = new int[3];//有三个元素的int数组

17、C++ new和数组?

A、为了让new分配一个数组对象,我们需要在类型名之后跟一对方括号,在其中指明要分配的对象的数目。
B、int *p = new int[INT_NUM];//方括号中的数必须是整型,但不必是常量

18、c++释放分配的空间?

delete p;    //p必须指向一个动态分配的对象(或空)
delete [] p;    //p必须指向一个动态分配的数组(或空)

二、内容在总结中

博客对应课程的视频位置:

 
原文地址:https://www.cnblogs.com/Renyi-Fan/p/13054484.html