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必须指向一个动态分配的数组(或空)
二、内容在总结中
博客对应课程的视频位置: