指针
始终记住arr[i]等于*(arr + i);
void指针
c允许把一个类型指针赋给void指针,但c++不行
int* p1;
void* p2;
p2 = p1;
void指针
c允许把一个类型指针赋给void指针,但c++不行
int* p1;
void* p2;
p2 = p1;
双指针
char **p; //二级指针,指向一个char *型的变量(即字符指针)。
指针数组
char (*p)[4]; //和二级指针差不多吧,指向带有四个元素的char 型数组的,不过它与char **的区别在于,它的计算(比如指针自增)时定量的,也就是多了个 数组元素是4的信息。
分配空间和delete
p = new char[5][4];
delete []p;
指针数组
char *p[4]; //指针数组,p不是指针, 是个数组名。不过这个数组的元素char*型的,也就是字符指针。
如下
char **p;
char (*q)[4];
char a[4][4];
q = a//正确
p = a//不兼容指针类型转换,警告
如果进行计算,比如输出p[1][0],其实就是*(*(p + 1) + 0),编译器就不知道p + 1实际该加多少,
然而用q的话就知道实际是地址加4个char的大小
char **p; //二级指针,指向一个char *型的变量(即字符指针)。
#include <iostream>///动态分配存储空间
using namespace std;
int main()
{
int i,m,n;
cout<<"Input the m & n:";
cin>>m>>n;
//申请 为 a[m][n]
int **a;
a=new int *[m];
for(i=0;i<m;i++)
{
a[i]=new int[n];
}
//释放
for(i=0;i<m;i++)
{
delete []a[i];
}
delete []a;
return 0;
}
using namespace std;
int main()
{
int i,m,n;
cout<<"Input the m & n:";
cin>>m>>n;
//申请 为 a[m][n]
int **a;
a=new int *[m];
for(i=0;i<m;i++)
{
a[i]=new int[n];
}
//释放
for(i=0;i<m;i++)
{
delete []a[i];
}
delete []a;
return 0;
}
指针数组
char (*p)[4]; //和二级指针差不多吧,指向带有四个元素的char 型数组的,不过它与char **的区别在于,它的计算(比如指针自增)时定量的,也就是多了个 数组元素是4的信息。
分配空间和delete
p = new char[5][4];
delete []p;
指针数组
char *p[4]; //指针数组,p不是指针, 是个数组名。不过这个数组的元素char*型的,也就是字符指针。
说明
char **p;
char (*q)[4];
char a[4][4];
q = a//正确
p = a//不兼容指针类型转换,警告
如果进行计算,比如输出p[1][0],其实就是*(*(p + 1) + 0),编译器就不知道p + 1实际该加多少,
然而用q的话就知道实际是地址加4个char的大小
#include <algorithm>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <list>
#include <map>
#include <set>
#include <sstream>
#include <string>
#include <queue>
#include <vector>
void display()
{
int** p;
int (*q)[4];
int a[5][4];
int sum = 0;
for(int i = 0; i < 5; i++) {
for(int j = 0; j < 4; j++) {
sum = i + j + sum;
a[i][j] = sum ;
std::cout << a[i][j] << " ";
}
std::cout << std::endl;
}
q = a;
std::cout << **(q + 2) << std::endl;
std::cout << **(++q) << std::endl;
std::cout << *a[4] << std::endl;
}
void show()/// 空间分配和释放
{
char (*p)[4];
p = new char[3][4];
strcpy(*p, "hyn");
std::cout << *p << std::endl;
delete []p;
}
int main(int argc, char * argv[])
{
char** p;
char (*q)[4];
char a[5][4] = {"hig", "abc", "der", "sdf", "plm"};
q = a;
std::cout << *(q + 1) + 1 << std::endl;
std::cout << a[1] << std::endl;
display();
show();
}
#include <fstream>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <list>
#include <map>
#include <set>
#include <sstream>
#include <string>
#include <queue>
#include <vector>
void display()
{
int** p;
int (*q)[4];
int a[5][4];
int sum = 0;
for(int i = 0; i < 5; i++) {
for(int j = 0; j < 4; j++) {
sum = i + j + sum;
a[i][j] = sum ;
std::cout << a[i][j] << " ";
}
std::cout << std::endl;
}
q = a;
std::cout << **(q + 2) << std::endl;
std::cout << **(++q) << std::endl;
std::cout << *a[4] << std::endl;
}
void show()/// 空间分配和释放
{
char (*p)[4];
p = new char[3][4];
strcpy(*p, "hyn");
std::cout << *p << std::endl;
delete []p;
}
int main(int argc, char * argv[])
{
char** p;
char (*q)[4];
char a[5][4] = {"hig", "abc", "der", "sdf", "plm"};
q = a;
std::cout << *(q + 1) + 1 << std::endl;
std::cout << a[1] << std::endl;
display();
show();
}
转载于:https://blog.51cto.com/cmdblock/116116